Riccardo Montolivo had scored and set another up against his former club to put the Rossoneri in cruise control, after Nenad Tomovic had been given a straight red card late in the first half. However, two second half penalties rescued a point for the Viola, who still harbour Champions League hopes for next season.
The result preserves Milan's unbeaten domestic record in 2013 and maintains their six point cushion over Fiorentina.
The home side welcomed Borja Valero back from a ban, while Stevan Jovetic made a quick recovery from a thigh injury to spearhead the attack. Alberto Aquilani faced his former club, but Gonzalo Rodriguez was banned.
Montolivo was given a hostile reception on his return to the ground he left on a free last summer after refusing to sign a new contract. He silenced his critics by scoring with the game's first real chance on 14 minutes. David Pizarro slipped attempting a turn, allowing Montolivo to pick his pocket and place a low shot past Emiliano Viviano into the bottom corner.
Viviano saved a Stephan El Shaarawy header from point blank range and Montolivo tugged Adem Ljajic back to halt a dangerous counter attack.
There was a first glimpse of Jovetic ten minutes before the break, as the Montenegrin tested Christian Abbiati from distance, then just missed sliding in to connect with Pasqual's low cross at the near post.
Six minutes before half time, Tomovic was given a controversial red for striking El Shaarawy with an arm. The defender was slightly ahead of his opponent when the ball was played forward and was reacting to a natural movement. Despite a swarm of purple shirts, the referee stood by his decision. More bad luck struck for the hosts right on half time, when Jovetic suffered a recurrence of his thigh injury and had to be withdrawn.
Milan thought they had put the game to bed on 62 minutes. Mathieu Flamini took advantage of non-existent Fiorentina marking to stroke home Montolivo's low cross for his first goal of the season.
A battling 12 minute display saw the home side draw level. Four minutes after Flamini's strike, the Viola were given the first of their two penalties. Ljajic's crazy dribbling took him into the box and he went down under Antonio Nocerino. The Serbian took the spot kick himself and buried it down the middle, sending Abbiati the wrong way. Mario Balotelli picked up a costly booking for trying to delay a free kick and will be suspended for next week's game with Napoli.
The second Fiorentina penalty was awarded when Juan Cuadrado was caught in the box by Mattia De Sciglio. This time, Pizarro made amends for his earlier mistake, smashing the ball over the diving Abbiati and into the far corner of the net.
Milan made attacking changes and introduced ex-Viola frontman Giampaolo Pazzini, while Vincenzo Montella brought Ljajic off to leave no recognised forward on the pitch, as he was content to settle for a well deserved point.
Fiorentina: Viviano; Roncaglia, Tomovic, Savic, (Compper 30) Pasqual; Aquilani, Pizarro, Borja Valero; Cuadrado, Jovetic, (Romulo 45) Ljajic (Migliaccio 82)
AC Milan: Abbiati; Abate, Mexes, Zapata, De Sciglio; Flamini, (Niang 77) Montolivo, Muntari; (Nocerino 46) Boateng, (Pazzini 83) Balotelli, El Shaarawy
Goals: Montolivo 14 (M) Flamini 62 (M) Ljajic pen 65 (F) Pizarro pen 72 (F)
Sent off: Tomovic 39 (F)