Jonny Bairstow fell agonisingly five runs short of a maiden Test century as he was dismissed for 95 with England bowled out for 315 with a six-run lead after the first innings.
Andrew Strauss’s side took the wickets of openers Alviro Petersen and Graeme Smith to seize the initiative later in the day, and the big wicket of Jacques Kallis followed as he was dismissed for 31 in the final session.
But the unflappable Hashim Amla was left rather ominously on 57 not out at the close of play, alongside nightwatchman Dale Steyn with the match left in the balance with two days to come.
England need to win the Test in order to retain their status as the world’s top-ranked Test side and to prevent South Africa from usurping them with the tourists leading 1-0 in the three-match series.
Fast bowlers Dale Steyn (four for 94) and Morne Morkel (four for 80) did most of the damage for the tourists as England were eventually dismissed with a slender lead after the first innings.
Matt Prior, who was alongside Bairstow at the start of the day, was furious with himself after he chased a wide delivery and was caught out off the first delivery with the second new ball for 27 having looked well set.
Stuart Broad added 16 runs before he tamely fended a short ball to Amla off the bowling of a fired up Steyn, and it was left to Graeme Swann to take command with a typically carefree innings.
Bairstow, in the team for the omitted Kevin Pietersen, was bowled before lunch by Morne Morkel following a hugely impressive and courageous effort by the 22-year-old, having come to the crease at 54 for four on day two.
Swann struck four boundaries and shared a fearless and entertaining stand with James Anderson, before his good friend and team-mate was caught by Jacques Rudolph in the gully off the bowling of Steyn.
Steven Finn contributed 10 runs at number 11 as he left Swann stranded on 37 not out after being caught out by a short delivery from Morkel, but England had edged in front at the halfway point.
Petersen and Smith looked assured at the crease as they established a 46-run partnership, but the South Africa skipper was trapped lbw by Swann for 23 as the England spinner found the elusive breakthrough.
His opening partner, Petersen, fell with just four further runs added to the tourists’ total as Broad got a full delivery to jag back and trap the batsman in front of the stumps.
Amla and Kallis looked unmovable at the crease as they added 81 runs for the third wicket, but the South Africa number four was then left bewildered and furious by the DRS for a second time in the match.
Finn, bowling from his favoured Pavilion End, got a delivery to nip back and rap the batsman on the pads, and Kallis was unable to overturn the original decision despite a review, leaving him to stalk off feeling aggrieved.
Replays suggested that the correct call had been made, but the batsman clearly remains unhappy about third umpire Rod Tucker’s controversial intervention to send him on his way in the first innings.
Steyn was sent out as a nightwatchman to help the tourists to the close of play without further frontline casualties, and he survived nine deliveries to be not out alongside Amla, who crashed two boundaries off the final over to be left on 57.
England will be acutely aware of the damage that an extended innings from Amla could inflict on day four, with the match very much in the balance ahead of the final six sessions.
With a lead of 139 runs in the second innings, South Africa will be determined to bat their hosts out of the game and ensure that they are not able to level the series and retain their place at the top of the rankings.