Riccardo Montolivo put the visitors in front in the 14th minute before Nenad Tomovic was given his marching orders in the 39th.
Things looked grim for Fiorentina when Mathieu Flamini doubled Milan's lead in the 62nd minute, but penalties from Adem Ljajic and Davide Pizarro salvaged a point for Vincenzo Montella's side, who remain six points behind their opponents, but edged two points clear of Inter Milan and Lazio.
The game could hardly have started worse for Fiorentina and former Inter midfielder Pizarro in particular.
He was robbed of possession 25 yards from his own goal by Montolivo, who took a few steps towards the penalty area before placing a low shot into the bottom left-hand corner.
Manuel Pasqual went close with a free-kick in the 29th minute with Stephan El Shaarawy's header kept out instinctively by Emiliano Viviano at the other end.
On the break, Montolivo was shown a yellow card for deliberately pulling the shirt of Ljaijic as Fiorentina had three men against one, yet the punishment was harsher for Tomovic five minutes later when he caught El Shaarawy with his elbow.
With 10 men, Fiorentina's challenge was already difficult, and it became unenviable when Flamini got the slightest of touches to Montolivo's cross to divert the ball inside the far post in the 62nd minute.
The home team did not throw in the towel, though, and were presented with the chance to reopen the game when Ljajic was fouled in the area by Antonio Nocerino.
Ljajic stepped up himself to score straight down the middle with Christian Abbiati diving to his right.
Just six minutes later, Fiorentina were given another spot kick when Juan Cuadrado was fouled as he entered the corner of the penalty area.
Pizarro stepped up this time to make amends for his mistake for the opening goal and earn Fiorentina an unexpected point.