Mohamed Salah scored twice and Stephan El Shaarawy netted the other as Roma won the second leg of their semi-final derby 3-2.
But goals from Sergej Milinkovic-Savic and Ciro Immobile sent Lazio through to the final, where they will likely meet Juventus.
The Serie A leaders visits Napoli on Wednesday, leading 3-1 from the first leg and firmly on course for a third successive league and cup double.
Trailing 2-0 from the first leg, Roma faced an uphill struggle. But fans packed the stadium in their droves, ending a 14-month protest after deeply unpopular security barriers were removed last week.
Roma attacked from the start and could have taken the lead in the third minute but Edin Dzeko volleyed wide of the left upright.
Roma dominated as Lazio were content to sit back on their advantage and attack on the counter.
And the visitors took the lead with their first attempt on goal in the 37th. Roma goalkeeper Alisson did well to parry Immobile’s effort but Milinkovic-Savic was on hand to tap in the rebound.
Roma leveled two minutes from halftime when Lazio defender Stefan de Vrij deflected Antonio Rudiger’s cross into the path of El Shaarawy, who volleyed into the bottom left corner.
Milinkovic-Savic and Immobile had scored in the first leg and so it proved again as they linked up for the Italy forward to restore Lazio’s lead in the 56th.
Desperately needing goals, Roma left gaping holes in defence and a long ball from Milinkovic-Savic allowed Immobile to sprint forward alone and slot it past the onrushing Alisson.
Refusing to go down without a fight Roma levelled again 10 minutes later. El Shaarawy’s effort came off the right post but Salah fired in the rebound.
Salah doubled his tally in the final minute with another follow-up as Lazio goalkeeper Thomas Strakosha couldn’t hold Radja Nainggolan’s effort.