Fiorentina hit the woodwork three times, but Mattia Destro scored in extra time to send Roma through to the Coppa Italia semi-final amid a brawl and three red cards.
The Giallorossi scraped through in Florence and will face Inter in the next round. The other semi-final is between Juventus and Lazio.
There was a huge row between the clubs and the Federation over where this game would be played, but the Giallorossi lost their appeal to move it to the Stadio Olimpico.
With Pablo Daniel Osvaldo and Erik Lamela suspended, Francesco Totti and Maarten Stekelenburg injured, Nico Lopez on international duty and Marquinhos dropped for disciplinary reasons, Zdenek Zeman surprised everyone by switching to a 3-4-3 system. Fiorentina continued to drop Emiliano Viviano and David Pizarro was only fit for the bench, but Alberto Aquilani and Luca Toni faced their former club.
Daniele De Rossi returned to the starting XI and his header from a corner skimmed the back post.
Stevan Jovetic drilled over the bar after a defensive error, but there was a double chance as Neto parried the first shot from Alessandro Florenzi, then the Miralem Pjanic follow-up was charged down.
Nicolas Burdisso needed a perfectly-timed tackle to stop Juan Cuadrado’s solo run in the box. Mattia Destro went extremely close, as he burst away from three Viola jerseys and his angled drive shaved a coat of paint off the base of the upright.
Marquinhos also nodded inches wide from a Roma set play, but Aquilani had a fantastic opportunity on 39 minutes when his free kick rattled the crossbar with Mauro Goicoechea well beaten.
Straight after the restart there was a howler from Nenad Tomovic to spark Roma’s counter-attack and Destro pulled back for the unmarked Florenzi, but Neto performed an incredible save from point-blank range as it was somehow palmed over the bar.
Another Florenzi strike, this time from distance, was smothered, while Destro’s first touch let him down on the counter. Michael Bradley went for the shot himself when on the counter with three teammates, who were all rather irritated with the American.
Fiorentina pounced on a poor clearance near the six-yard box and Stevan Savic’s effort was turned across the face of goal, Burdisso getting a crucial touch to stop Gonzalo Rodriguez nodding in.
De Rossi had the ball in the back of the net from a Burdisso free kick, but was flagged offside. It was tight, but seemed to be an accurate decision.
Gonzalo Rodriguez gave the ball away on the edge of his own area, but was relieved to see Destro balloon over the bar when clear on goal.
Chaos in the Roma box, as Aquilani just failed to get his head to a chipped pass when he was eight yards out, then Goicoechea missed the ball and nobody was able to get the final touch.
A glancing Tomovic header looked to be going on target, but it accidentally hit teammate Rodriguez.
Borja Valero looked as if he might’ve won it deep into stoppages, but his screamer cracked against the outside edge of the upright.
Moments later, Destro had the exact same feeling as his lob soared over Neto towards an open net until Savic performed a decisive goalline clearance. It was the last touch of normal play, as this quarter-final went to extra time.
The deadlock was finally broken when Pjanic got to the by-line and pulled back for Destro to come sliding in from a couple of yards.
Fiorentina poured forward in a bid to get it back on track, as Cuadrado hit the side-netting from a tight angle and Goicoechea fingertipped an Aquilani free kick out from under the bar.
The Viola hit the frame of the goal for the third time, as Cuadrado’s volley cracked against the base of the far post, then the follow-up was palmed off the line by Goicoechea.
Jovetic and Adem Ljajic fired off target from distance, while a Jovetic diving header was deflected.
Destro was clear on goal, but Neto came rushing off his line and out of the box to clear with his torso and feet.
Rodrigo Taddei received a second yellow card for a reaction foul on Borja Valero, who he had clashed with moments earlier.
The game ended in absolute chaos. Cuadrado and Dodo were both shown a straight red for an unseemly brawl, then as they were going into the tunnel another fight broke out. Stewards and photographers were shoved over and play had to be halted as the other players rushed to intervene and calm the situation.
Fiorentina 0-1 Roma aet
Scorers: Destro 97 (R)
Fiorentina: Neto, Tomovic, Rodriguez, Savic; Cuadrado, Migliaccio (Romulo 65), Aquilani, Borja Valero, Pasqual (Llama 105); Jovetic, Toni (Ljajic 78)
Roma: Goicoechea; Marquinhos, Castan, Burdisso; Piris (Taddei 80), De Rossi, Bradley, Balzaretti (Dodo 59); Pjanic (Tachtsidis 102), Destro, Florenzi
Sent off: Taddei 117 (R), Cuadrado 121 (F), Dodo 121 (R)
Betting on Serie A? Bet365 are offering a 100% deposit bonus, up to £200 - find out more