Ten-man AC Milan emerged from Turin empty handed despite a battling performance against Juventus, who reached the Coppa Italia final on away goals.
The major drama came in the 17th minute when Cristiano Ronaldo saw a penalty well saved by Donnarumma, before Ante Rebic saw straight red within seconds for a dangerous high boot.
Milan battled incredibly hard against a man advantage and had their half-chances, but ultimately it would be Juventus who progressed on away goals.
The Rossoneri could have gone a goal down inside the opening two minutes when left-back Alex Sandro was allowed to burst into the box and square to Douglas Costa, but the Brazilian pulled his shot inches wide of the far post.
The home side were given another good opportunity from a set piece inside the fifth minute after a clumsy foul by Alessio Romagnoli, but Paulo Dybala’s effort was blocked and the resulting corner headed wide by Matthijs de Ligt.
Juve continued to have the bulk of the possession and pressure, and Dybala once again saw a shot deflected behind for a corner, from which there was a handball shout on Andrea Conti that – after VAR check – resulted in a penalty.
Cristiano Ronaldo stepped up to take the spot kick and in a remarkable sequence of events he hit the inside of the post and the ball bounced away, but from the resulting clearance Rebic was sent off for a high boot on Danilo that was reckless and dangerous in truth.
Juve looked to make their numerical superiority count and had a good chance to do so just before the half hour mark as a cut-back found Ronaldo, but the Portuguese forward fired his shot over first time from inside the area.
The Bianconeri fashioned another chance not long after when a cross from the right found Blaise Matuidi in the area, however the Frenchman’s reaction shot was straight at Donnarumma who parried away.
Milan began to get themselves into the game and spent more time in their opponent’s half without fashioning many opportunities, while all the chances were at the other end with Ronaldo seeing a curling effort from 18 yards easily saved six minutes before the break.
The first chance of the second half went to Milan when Bonaventura found space down the right side to cross to Calhanoglu, whose stooping header was well directed but wide of the near post.
Milan made their first chance in the 52nd minute as Bonaventura was brought off after a tiresome shift in place of Rafael Leao.
As the minutes ticked by it became clear what Pioli’s approach was: to contain Sarri’s side and pick the right moments to counter with pace. However the inverse began to happen, and Ronaldo saw an effort deflect and loop narrowly over after Bennacer’s giveaway had been seized upon.
From the resulting corner Juve were inches away from taking the lead, but the ball flew across the face of goal from a flick at the near post and to safety as Bonucci couldn’t react quick enough.
A triple sub for Juventus followed just after the hour mark as Pjanic came off for Sami Khedira, Matuidi went off for Adrien Rabiot and Federico Bernardeschi came on for Costa.
Despite an admirable and battling effort from Milan, it was the hosts who continued to have the best chances. Just inside the final 20 minutes a vital intervention from Kjaer prevented a straightforward header for Ronaldo.
Milan began to probe, and Kjaer had a golden chance in the 79th minute as he was found unmarked with a corner, but the Dane headed wide of the near post.
Donnarumma was called into action moments later to palm wide a curling shot from Dybala that was heading for goal. The Milan keeper parried over again from the corner as Rabiot scuffed his effort into the ground.
A double substitution followed for Milan as Paqueta and Kessie came off for Lorenzo Colombo – making his senior debut – and Rade Krunic.
With three minutes to go Milan made their final two subs as Diego Laxalt and Alexis Saelemaekers came on for Calabria and Conti.
A smart Donnarumma save from a swerving Alex Sandro shot would be the last notable action of the game as the Bianconeri held off to reach yet another cup final in Rome.