In an astonishing night in Paisley, doubles by Buddies’ midfielders Andy Dorman and Steven Thomson stunned the Hoops who were booed off the park by the travelling fans at the end.
The Parkhead side, who finished the game with six attackers on the park, remain 10 points behind their Ibrox rivals who have two games in hand.
In the 38th minute and against the run of play, the Paisley side took the lead, seconds after a penalty claim for a push on Dargo by Edson Braafheid had been ignored by Richmond.
When the ball came back into the centre the Hoops’ defence failed to clear and it was Dorman who fired past Lukasz Zaluska.
Stunned Celtic retaliated and Georgios Samaras had a good effort from long-range parried by Paul Gallacher but the Saints defence cleared their lines before the interval whistle sounded.
The pressure was slowly mounting on the Paisley side in the second half and after Gallacher flapped again at a cross, Buddies’ midfielder Hugh Murray threw himself to block a Robbie Keane drive from close range.
But there was more drama in the 58th minute when Saints sensationally doubled their lead.
The foraging Dargo robbed Thompson down the left, played a one-two with Mehmet then shaped to shoot before setting up Steven Thomson who rifled low past Zaluska from just inside the box.
Desperation was creeping in to Celtic’s play as the minutes ticked away and in the 76th minute striker number six, Morten Rasmussen, came on for Braafheid. But in the 84th minute Dorman took advantage of more slack play in the Hoops’ defence to slam number three past Zaluska.
Moments later, the Celtic keeper had to stretch to catch an attempted lob by Dargo as the Celtic backline threatened to dissolve, as they did when Thomson completed his brace three minutes later.
Meanwhile, Rangers’ hopes of a domestic treble were shattered as they crashed out of the Scottish Cup to a last-gasp winner from Dundee United’s David Robertson.
Robertson struck in the final minute of the quarter-final replay to secure United a meeting with Raith.
ST MIRREN: Gallacher, Ross, Mair, Potter, Murray, Dorman (O’Donnell 90), Mehmet (Higdon 86), Thomson, Brady, Robb, Dargo (Loy 90).
CELTIC: Zaluska, Wilson, Thompson, O’Dea, Braafheid (Rasmussen 75), McGowan, N’Guemo, Ki (Fortune 60), McGeady, Keane, Samaras.
Referee: C Richmond.