Juventus are again defeated by one of the relegation strugglers for the second week running, but Perugia still have a slim chance of avoiding the drop.
Juventus lost a Scudetto in this Stadium, but following last week's humiliating 4-3 home defeat to Lecce they had every motivation to get a convincing result.
Perugia were desperate for points, as a defeat would mathematically doom them to the drop. It has been a controversial campaign and the referee was under close scrutiny.
The Bianconeri, who this week learned that it is Marcello Lippi's last season in charge, had a strong start but the finishing of Alessandro Del Piero and David Trezeguet left something to be desired.
Perugia slowly began to take control, but Franco Brienza was stretchered off following an accidental collision with Lilian Thuram. English striker Jay Bothroyd was therefore given a rare chance to shine.
Pavel Nedved had the best early chance with a fierce drive that skimmed the woodwork.
But Juve's defensive problems continued and Gianluigi Buffon rushed across his line to block a Bothroyd backheel.
There were penalty appeals just before the break when Nedved's close-range effort was closed down by Salvatore Fresi's arm, then Stephen Appiah nodded just wide.
When the deadlock was eventually broken at the dawn of the second half, it was only right that it was scored by a former Juventus star. Fabrizio Ravanelli turned Mark Iuliano and swung in a brilliant effort from the edge of the box.
Juventus fought back and Zeljko Kalac did well to parry Del Piero's ambitious backheel strike.
Marcello Lippi introduced former Perugia hero Fabrizio Miccoli for the final half-hour in a bid to spice up their attack.
There was an historic moment on 74 minutes as Al-Saadi Gheddafi stepped on to the field for his Serie A debut. He is the first Libyan ever to play in the Italian top flight, but above all it was his first official appearance after an eventful spell with the club that included a ban for failing a nandrolone test.
There was also bad news for Juventus, as Ciro Ferrara was shown his second yellow card and left the Turin outfit in ten men.
Ravanelli nearly doubled Perugia's lead with a trademark free kick that Buffon flew to palm out.
Perugia: Kalac; Coly, Nastos, Fresi, Fabiano; Ze' Maria (Fusani 88), Codrea, Obodo, Di Francesco; Brienza (Bothroyd 18) (Gheddafi 74), Ravanelli
Juventus: Buffon; Thuram, Ferrara, Iuliano, Pessotto (Boudianski 58); Appiah, Maresca (Miccoli 58), Zambrotta; Nedved (Camoranesi 54); Del Piero, Trezeguet
Ref: Pieri
Sent off: Ferrara 75 (J)
------------------------------------------------------------------------
Milan are crowned the Champions of Italy thanks to Andriy Shevchenko's early header, but the Scudetto party was spoiled by Roma hooligans.
Anything less than a Roma victory - a result they haven't earned for 18 years - would crown Milan Champions of Italy. All three meetings between these two clubs this season (including the Coppa Italia) had gone 2-1 to the Rossoneri, so Fabio Capello's men were going against the odds.
Carlo Ancelotti surprised many pundits by choosing to leave Manuel Rui Costa on the bench and field Jon Dahl Tomasson upfront.
Capello was forced to do without the injured Cristian Chivu and suspended John Carew, but stuck with the 4-4-2 as Jonathan Zebina stepped in to central defence.
It took Milan just 90 seconds to break the deadlock as Kaka' charged down the right flank and his cross was nodded in by an unmarked Andriy Shevchenko.
Former Roma defender Marcos Cafu skipped past Olivier Dacourt on that same flank and his angled drive struck the side-netting.
As the first half wore on the Rossoneri just seemed to take more control of the game with a very aggressive performance. Andrea Pirlo and Clarence Seedorf's long-range efforts were just off target.
The first Roma effort came on 39 minutes, as Gennaro Gattuso's error allowed Vincent Candela a shot from eight yards, but Dida was ready for it.
Just before the break the San Siro held its collective breath when Kaka' set up Shevchenko on the edge of the box, but his angled drive whistled mere inches wide of the far post.
Fabio Capello needed to make a change and introduced Under-21 international creative midfielder Gaetano D'Agostino for the disappointing Candela.
A scuffle broke out at the dawn of the second half as Totti's free kick took a deflection off the wall and there were furious penalty appeals. Replays suggest the ball did strike Shevchenko's elbow - an identical incident to the one that saw Siena given a penalty against Milan a fortnight ago.
The tension rose further when a flare thrown by Roma fans behind Dida's goal shook Gattuso and play was halted for four minutes.
This incident only seemed to fire up the Giallorossi more and Francisco Lima ballooned a great chance over the bar.
The San Siro was a powder keg and a brawl broke out between Brazilians Kaka' and Lima, but the referee opted to only book the two players.
Cafu's high challenge on Totti in the box handed Roma an indirect free kick from 12 yards, but Cassano's effort was charged down by the wall.
Milan poured forward on the counter-attack and Shevchenko's close-range attempt was closed down by some close marking.
The Rossoneri weathered the Roma storm and became dangerous again with Shevchenko's attempt going just wide and a fierce Tomasson effort fingertipped off target by Ivan Pelizzoli.
The goalkeeper was again called into a stunning reaction save when Alessandro Nesta redirected a corner kick towards the far post.
Roma kept on pushing and Mancini's half-volley went wide, but play was again halted as Dida was struck by a metal object thrown by the Roma fans behind his goal.
Milan: Dida; Cafu, Nesta, Maldini, Costacurta; Seedorf (Kaladze 95), Pirlo, Gattuso; Kaka' (Rui Costa 85); Shevchenko, Tomasson (Ambrosini 80)
Roma: Pelizzoli; Panucci, Zebina, Samuel, Candela (D'Agostino 46); Mancini, Emerson, Dacourt, Lima (De Rossi 75); Totti, Cassano (Delvecchio 73)
Ref: Messina