Coach Daniele De Rossi fielded the same team that achieved success in the first-leg match at the San Siro, with the sole exception of Edoardo Bove who replaced the suspended Bryan Cristante in midfield.
For his part, Milan's Stefano Pioli tried to modify his tactics in an attempt to slow Roma's' countermoves which proved to be very effective in the previous match.
In any case, the match began with the home team's players who showed no fear in the face of the Rossoneri's initial management of the ball, on the contrary they proved to be compact and lucid in the rapid counterattacks.
In fact, in the 12th minute the Giallorossi took the lead with a goal from defender Gianluca Mancini who scored the winner in the first leg.
The action of the go-ahead goal began precisely from a defensive play by Mancini who, after recovering the ball in his own third, pushed forward, then passed to Lorenzo Pellegrini who tried to finish with an excellent curling shot that hit the post. The ball ricocheted right to the feet of Mancini who simply had to push the ball into the net.
AC Milan immediately reacted by pouring into the offensive zone.
First came a high shot from Theo Hernandez and next with a central insertion by Ruben Loftus-Cheek, whose effort clanged the crossbar.
Despite the offensive push from the visiting team, it was once again the Giallorossi who found the goal.
In minute 22, Pellegrini received the ball and without any opposition pressure the Roma captain was able to advance and send Romelo Lukaku deep. The Belgian striker clearly won the physical tackle against Matteo Gabbia and then rolled the ball into the box in search of a partner.
The ball was badly cleared and easily controlled by Paulo Dybala who, from a position favorable to him, and without close marking, executed a curling left-footer that headed for the far corner and left goalkeeper Mike Maignan with nothing to do.
The goal put AS Roma up to 2-0 on the night and 3-0 on aggregate.
Then came two pieces of bad news for Roma fans that tempered the great enthusiasm.
The first was the muscle injury to Lukaku who was forced to ask for a substitution. In his place came England striker Tammy Abraham.
The second concerned the direct expulsion of fullback Zeki Celik for a foul from behind against Rafael Leao who had dribbled past him for the first time in the match.
However, the Rossoneri were unable to find a goal before the end of the first half.
In the second half, coach Pioli sent on an extra attacker, eliminating Loftus-Cheek and Davide Calabria, inserting Samuel Chukwueze and Tijjani Reijnders.
Christian Pulisic took advantage of the first opportunity for Milan but he shot high. Then the Rossoneri began a long possession which, however, proved to be not at all incisive.
The Giallorossi once again become dangerous behind a counterattack led by Leonardo Spinazzola but his shot was rejected by Maignan.
Time passed without the Rossoneri finding an opening between the narrow lines of the Giallorossi defense and without their best men showing particular brilliance in their choices.
In the 85th minute, the Rossoneri got a goal from defender Matteo Gabbia.
Chukwueze tried to score with his classic left-footed shot but Roma netminder Mile Svilar was paying attention.
Total disappointment for the Rossoneri who missed out on all their goals this season.
Great enthusiasm instead for the Giallorossi who will face Bayer Leverkusen, fresh winners of the Bundesliga for the first time in their long history, in the semifinals.