Roma fans saw their team beat city rivals Lazio 3-2 at the Stadio Olimpico but lose the Coppa Italia semifinal 4-3 on aggregate.
Mohamed Salah scored twice and Stephan El Shaarawy netted the other as Roma won the second leg of their semifinal derby.
But goals from Sergej Milinkovic-Savic and Ciro Immobile sent Lazio through to the final, where they could meet Juventus. The Serie A leaders visit 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 knew they faced an uphill struggle. But their 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 minute. Roma keeper Alisson did well to parry Immobile's effort but Milinkovic-Savic was on hand to tap in the rebound.
Roma levelled two minutes from half-time 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 minute.
Desperately needing goals, Roma had 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.
Roma were not going to go down without a fight and 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 could not hold Radja Nainggolan's effort.