Riccardo Montolivo, returning for the first time to the club where he spent seven seasons, put Milan ahead after 14 minutes and Fiorentina were in more trouble when Nenad Tomovic was sent off before halftime.
Matthieu Flamini extended Milan's lead in the 62nd minute before Adem Ljajic and David Pizarro both converted penalties to level the score.
Third-placed Milan (58 points) stayed six points ahead of fourth-placed Fiorentina (52) with Inter Milan and Lazio two points further behind. Inter host Atalanta (1845) and Lazio face neighbours AS Roma on Monday.
The top two in Serie A qualify for the Champions League group stage and third place earns a place in the playoff round.
Montolivo ignored the jeers from the crowd as he dispossessed Pizarro 30 metres from goal and rolled the ball into the corner from the edge of the area.
Fiorentina were in more trouble when Tomovic was given a straight red in the 40th minute after being judged to have elbowed Stephan El Shaaraway as the two tussled for the ball.
The decision brought furious protests from Fiorentina players who surrounded the referee to remonstrate.
Fiorentina playmaker Stevan Jovetic, surprisingly included despite a recent thigh strain, then limped off after appearing to aggravate the injury to complete a nightmare first half for the hosts.
Milan appeared home and dry when Flamini scored in the 62nd minute from a chance created by Montolivo but instead Fiorentina hit back.
A mazy Ljajic run in the area ended with his legs crumpling after the slightest of touches from Antonio Nocerino and the Serb converted the penalty himself in the 66th minute.
Seven minutes later, Fiorentina were awarded another penalty when Juan Cuadrado was tripped and Pizarro stepped up to fire home and atone for his earlier mistake.
Milan could have had a penalty in stoppage time when Sebastian Roncaglia blocked Ignazio Abete's shot with his hand, although it appeared to be accidental. — Reuters