At Stadio Franchi, Alessandro Mancini put Roma ahead after 19 minutes when he superbly looped the ball over the advancing Sebastien Frey from the edge of the area.
Fiorentina defender Alessandro Gamberini equalized five minutes later when he slotted home into an empty net after Roma keeper Alexander Doni mistimed his jump, failing to handle a cross from the left.
Ludovic Giuly restored the visitors' lead seven minutes before the break when his shot from inside the area took a slight deflection and went into the back of the net.
Romanian striker Adrian Mutu leveled the score again in the 79th minute from the spot after Christian Vieri was brought down by Matteo Ferrari.
Fiorentina finished the game with 10 men as Marco Donadel was sent-off for a second bookable offense.
Despite the draw, Roma are still on top of the league table with 11 points, on level with Inter Milan who made up for their recent disappointing results after defeating Sampdoria.
In-form Swedish striker Ibrahimovic opened the scoring in the 24th minute before doubling the lead four minutes after the interval.
Portuguese winger Luis Figo wrapped up the win ten minutes later.
AC Milan, despite taking the lead, were handed a stunning 2-1 defeat to Palermo as their Serie A crisis mounted.
Clarence Seedorf fired the Rossoneri in front in the tenth minute but was cancelled out by Aimo Diana in the 73rd minute.
Fabrizio Miccoli's free-kick three minutes into stoppage time handed Palermo all three points.