Graeme Swann led a spirited rearguard action by the England tail as South Africa ended the third day of the first Test 71 runs ahead with nine wickets in hand on Friday.
Swann, who took five for 110 in South Africa's first innings 418, struck a career-best 85 to lift England from a perilous 242 for eight to 356 all out.
Left-arm spinner Paul Harris took five for 123 and was called into action as a batting nightwatchman after James Anderson bowled South African opener Ashwell Prince for a duck in the first over of the second innings.
The hosts ended the day on nine for one after four overs with Graeme Smith on six.
England were in trouble when Swann came to the crease but he was aggressive from the outset and his 85 came off just 81 deliveries including 10 fours and two sixes.
England's ire was raised when Stuart Broad (17) was given out lbw to off-spinner JP Duminy after South Africa had taken 34 seconds to ask for the umpire decision review.
Broad believed there had been a signal from the changing-room and television footage showed Broad in the third umpires' box remonstrating with Amiesh Saheba and match referee Roshan Mahanama.
But Swann found an able partner in Anderson who scored 29 in a record ninth-wicket stand of 106 for England against South Africa.
Makhaya Ntini eventually had Anderson caught by Morne Morkel diving forward at mid-off and Swann was the last man out when his slog-sweep landed in the hands of Graeme Smith at deep square-leg.
Batting is still tricky on a pitch offering inconsistent bounce and Prince was undone by a delivery that kept low and came off the inside edge of the bat.
Spinner Harris earlier took four wickets to reduce England to 238 for seven at tea.
Fast bowler Morkel began the afternoon collapse when Kevin Pietersen, on 40, drove loosely outside the off stump and edged the ball back into the stumps.
Ian Bell scored just five before he bizarrely shouldered arms and was bowled by Harris.
Matt Prior found the conditions extremely difficult as he scored just four runs in 44 minutes before sweeping at Harris and top-edging the ball to deep backward square-leg.
The experienced Collingwood looked in control, though, as he reached his 17th Test half-century by sweeping Harris for his fifth four.
But the next delivery turned away and found the edge of the bat on the way to slip, ending Collingwood's resistance for 50 and leaving England on 221 for seven.
England had resumed on 88 for one in the morning and captain Andrew Strauss added only two runs before he was totally flummoxed by a delivery from Makhaya Ntini that kept low and was bowled for 46.
He and Jonathan Trott added 73 runs for the second wicket and Trott battled to 28 off 117 balls before advancing down the pitch to Harris and being comprehensively bowled.
South Africa (1st innings): 418 (J. Kallis 120, J-P. Duminy 56; G. Swann 5-110).
England (1st innings): (88-1 overnight)
A. Strauss b Ntini 46
A. Cook c Boucher b De Wet 15
J. Trott b Harris 28
K. Pietersen b Morkel 40
P. Collingwood c Kallis b Harris 50
I. Bell b Harris 5
M. Prior c De Wet b Harris 4
S. Broad lbw b Duminy 17
G. Swann c Smith b Harris 85
J. Anderson c Morkel b Ntini 29
G. Onions not out 4.
Extras: (b-8, lb-8, nb-12, w-5) 33.
Total: (all out; 104 overs) 356
Fall of wickets: 1-25, 2-98, 3-119, 4-168, 5-189, 6-211, 7-221, 8-242, 9-348, 10-356.
Bowling: Ntini 23-4-78-2, De Wet 20-3-72-1 (nb-6, w-1), Morkel 21-0-60-1 (nb-6), Harris 37-10-123-5, Duminy 3-0-7-1.
South Africa (2nd innings):
A. Prince b Anderson 0
G. Smith not out 6
P. Harris not out 2.
Extras: (lb-1) 1
Total: (for one wicket, four overs) 9
Fall of wicket: 1-2.
Bowling: Anderson 2-0-5-1, Onions 2-1-3-0.