An Anthony Stokes double and a Niall McGinn strike had the visitors three goals up after only 13 minutes and seemingly cruising at McDiarmid Park, but Sam Parkin reduced the deficit before the break.
Saints midfielder Murray Davidson headed in the second in the 54th minute to promise a remarkable fightback and, seconds from the end, the Hoops had Fraser Forster to thank for avoiding extra-time when he pulled off a great save from substitute Jennison Myrie-Williams, who had replaced Steven Anderson at the interval.
However, while Parkin missed a decent chance to level earlier Celtic also passed up opportunities to draw further ahead.
The visitors were looking to bounce back from their home defeat by Rangers at the weekend and they began in promising fashion when they raced in to a three-goal lead after only 13 minutes.
Stokes, who was playing through the middle with Gary Hooper, broke the deadlock in the eighth minute.
The former Hibernian striker played the ball out to Ki Sung-yueng on the right and when the Saints defence failed to clear the South Korean’s cross, Stokes quickly dispatched a low drive past Perth keeper Graeme Smith.
Moments later Smith had to make a fine save to prevent Stokes grabbing his second.
However, in the 11th minute, after pulling off a decent save from a Ki free-kick, the keeper was helpless to prevent McGinn squeezing the loose ball in from the angle.
It seemed too easy for the Parkhead men and two minutes later the tie appeared over when McGinn, making his first start of the season, took a Hooper pass and played the ball across to Stokes who beat Smith from close range, the ball going in off the post. It looked like free-flowing Celtic could score at will as St Johnstone struggled to get any sort of foothold in the game.
Parkhead midfielder Joe Ledley had the ball in the net after racing on to a Hooper pass which split open the home defence only to be ruled offside, television pictures casting doubt on that decision.
However, in the 31st minute the Hoops’ defensive frailties, which cost them dear against Rangers, were evident again when Parkin was allowed time and space to drive a left-footed volley past Forster from 16 yards.
Seconds before the break Forster was forced in to a fine block from Parkin after some more hesitancy in the Celtic defence.
St Johnstone boss Derek McInnes brought on Myrie-Williams for Anderson for the start of the second half and immediately the Perth side set about reducing the deficit further.
But in the 52nd minute, after good work by McGinn on the right, it was Ledley who came close when his drive from 16 yards was deflected wide of the target for a corner which came to nothing.
However, in the 54th minute Saints were right back in the game when Danny Grainger’s corner was met by the unmarked Davidson who powered a header high in to the net.
Celtic looked stunned but moments later, with Saints chasing the leveller, Stokes released Hooper with a wonderful cross-field pass to put Hooper clean through but the former Scunthorpe player curled his shot from the edge of the box high and wide.
In the 61st minute, though, Saints might have been level.
Georgios Samaras initially lost possession but when Davidson set up Parkin, unmarked at the edge of the box, his right-footed shot was saved by Forster.
At the other end, in a Celtic, breakaway, McGinn forced Smith in to a decent save with a low drive.
In another Celtic breakaway which laid open the home defence, Hooper slipped as he tried to round Smith inside the penalty area and the chance was lost.
The home side kept up the pressure and forced several corners but the Celtic defence appeared more concentrated, if little more convincing.
There was a lot of desperation about the Perth men in the closing stages but in the last Forster pulled off a tremendous save down to his right from Myrie-Williams’s long-range effort to prevent extra time.