Milan made the perfect start when Sulley Muntari's opener with just 20 seconds on the clock stunned the home crowd.
But Andrea Pirlo levelled matters 14 minutes later before Sebastian Giovinco and Giorgio Chiellini turned things around after the break.
Milan were always facing an uphill struggle when Philippe Mexes was sent off with 15 minutes to play, and a late Muntari second was scant consolation.
Simone Padoin, Claudio Marchisio and Fabio Quagliarella all came into the Juventus starting line-up as boss Antonio Conte made changes after their disappointing draw with Galatasaray in the UEFA Champions League.
Meanwhile, Massimiliano Allegri made two alterations from his side's 1-1 draw against Ajax, with Antonio Nocerino named in midfield and Alessandro Matri coming in to face his former club, for the suspended Mario Balotelli.
Juventus' hangover from European action continued as they fell asleep inside the first minute to go behind after just 20 seconds as Nocerino's wayward shot found Muntari at the far post and the midfielder side-footed the ball past the helpless Gianluigi Buffon.
Quagliarella had a glorious chance to level as Juve sought a response, but he lent back at the pivotal moment, before Kwadwo Asamoah stung Christian Abbiati's palms as the goalkeeper turned the ball over for a corner.
The equaliser was not long in coming, however, as Pirlo pulled the home side level in the 15th minute with a free-kick that found the bottom corner after Nigel de Jong had brought down Carlos Tevez.
The experienced midfielder curled the ball expertly over the wall, although Abbiati could have done better as he palmed the ball into the net.
The frantic pace eventually subsided, although Juventus had strong penalty claims turned down when Tevez was brought down inside the box just before the break - the Argentinian striker's appeals waved away after Kevin Constant's apparent push.
Tempers flared early in the second half when Mexes punched Chiellini, although amazingly the referee failed to spot the incident and the Milan defender escaped punishment.
With both sides cancelling each other out, Conte threw on Giovinco to replace Quagliarella soon after - and within a few minutes the forward had repaid that faith.
The Italy international picked up the loose ball on the edge of the box after 69 minutes following more Juventus pressure, before finding room to smash his shot into the bottom corner.
The game swung further in Juve's favour when Mexes was sent off for a second yellow card – failing to escape for a second time after a foul on Giovinco on the edge of the box.
And when Chiellini added a third from the resulting free-kick, reacting first after Pirlo's brilliant effort had cannoned back off the crossbar, the victory was secured.
There was still time for Muntari to add a second for Milan when his deflected effort surprised Buffon at the near post, but Juve held on in a nervous last minute.
Get the best features, fun and footballing frolics straight to your inbox every week.
Thank you for signing up to Four Four Two. You will receive a verification email shortly.
There was a problem. Please refresh the page and try again.