Lazio, their principal rivals for the Scudetto this season, were also 2-1 winners, over Parma at the Olympic Stadium, but they failed to bridge the one-point gap separating them from Alberto Zaccheroni's team at the start of the day.
The Argentinian winger Andres Guglielminpietro opened the scoring at Perugia in the 11th minute with a low shot from the edge of the area. Oliver Bierhoff made it 2-0 in the 31st minute and Milan looked to be cruising.
Instead, Perugia pulled one back three minutes later when their Japanese playmaker Hidetoshi Nakata converted a penalty after Milan Rapajc was tripped in the area. Milan came under pressure but held on in a tough second half.
Marcelo Salas gave Lazio hope with two goals and had a third disallowed in their victory over Parma. The Chilean put Lazio ahead in the 27th minute, but Parma hit back nine minutes into the second half with an equaliser from Paolo Vanoli. Lazio thought they had a winner when Salas again found the back of the net, only to have it disallowed for offside.
But there was no mistake in the 76th minute when Salas made it 2-1, all to no avail as the result filtered through from Perugia.
Roma booked their place in the Uefa Cup with a 4-1 win at Vicenza, but there will be a play-off for the second Uefa place between Juventus and Udinese.
The Brazilian Paulo Sergio struck first for Roma, but Gabriele Ambrosetti equalised for Vicenza before the hosts had their French defender Ousmane Dabo sent off for a second bookable offence.
They paid dearly, Marco Delvecchio firing home a left-foot shot, Carmine Gautieri making it 3-1 and Brazilian Fabio Junior adding the fourth in the 80th minute.
Udinese were 3-1 winners at relegated Empoli - Brazilian Marcio Amoroso scoring twice to overtake Fiorentina's Gabriel Batistuta as Serie A's leading goalscorer, with 22 goals.
Outgoing champions Juventus registered a 3-2 victory over Venezia, with goals from Antonio Conte and Filippo Inzaghi setting them on the road.
The Brazilian Tuta pulled one back for the visitors, but a shot from Henry was deflected home in the closing minutes by Gianluca Luppi to make it 3-1, taking the sting out of Uruguayan Alvaro Recoba's 90th minute goal.
Ronaldo set Internazionale on their way to a 3-1 victory over Bologna, their Uefa Cup play-off rivals next week. The Brazilian scored after nine minutes, while there were three goals in the last four minutes.
The Croatian defender Dario Simic made it 2-1 to Inter, Igor Simutenkov struck for Bologna but Nicola Ventola put the result beyond doubt.
Down in the relegation zone, Piacenza's 40-year-old defender Pietro Vierchowod nodded them into a second-half lead against Salernitana, but the visitors equalised soon after with a penalty from Salvatore Fresi. The draw relegated Salernitana to Serie B, along with Vicenza, Sampdoria and Empoli.
Bobby Robson's PSV Eindhoven reached the Champions' League with a last- minute winner from Arnold Bruggink to give them a 3-2 win over Utrecht and third place in the table.
PSV started the day fifth but took advantage of defeats for Vitesse and Roda Kerkrade, who were third and fourth respectively.
It meant disappointment for Vitesse, who seemed destined to take third place after being second most of the season. They went into a 1-0 lead at Feyenoord through Martijn Reuser, but the Rotterdam side came back through Patrick Paauwe, with a powerful free kick, and Jon Dahl Tomasson five minutes before time.
With the score at 2-2 in PSV's game, Robson, aware of the latest scores in Rotterdam and at RKC Waalwijk, where RKC avoided direct relegation by beating Roda 4-1, shouted for a do-or-die attempt and Bruggink found the net in the final seconds to secure a place in the preliminary round of the Champions' League.
PSV beat Vitesse on goal difference, with both teams ended up on 61 points, well behind champions Feyenoord's 80 points. Willem II Tilburg will accompany Feyenoord in the Champions' League after ending up second with 65 points.
Vitesse, Roda Kerkrade and Ajax, the Dutch Cup-winners, will play in the revamped Uefa Cup. Sparta and RKC have to play-off with six Second Division teams for two places in the top flight.Reuse content