Stephan Lichsteiner then fired a header into the hands of Donnarumma from Pogba’s cross, and when Mario Lemina found Mario Mandzukic with a great through ball moments later Donnarumma parried the Croatian striker’s half-volley on the turn on 74 minutes.
Allegri replaced Lichsteiner with Cuadrado a minute later, and six minutes from the finish M’Baye Niang replaced Poli.
Into extra-time, Juve got another sniff when a tiring Riccardo Montolivo gifted the ball away in midfield and Mandzukic set up Pogba for a piercing strike from distance that Donnarumma did well to parry.
Carlos Bacca then fired a spectacular overhead kick just over and minutes later the hosts had claims for a penalty waved away when Honda came down after clashing with Giorgio Chiellini.
Milan were tiring and Juve’s late changes made the difference when a counter saw Cuadrado allowed to fire a chip over for the unmarked Morata, who swept past Donnarumma with ease.
Milan threatened a late leveller when Jose Mauri’s low drive from the edge of the area shaved the post, but it was not to be for the struggling Serie A giants