They lost two wickets in the first over and, although Jonathan Trott (52) and Ravi Bopara (60) put on 99, England were all out for 171 in the 46th over.
South Africa appeared to be coasting in reply at 124-3 but lost four wickets for three runs in five overs.
Stuart Broad then took two wickets in four balls to finish with 4-15 as South Africa fell for 165 with 14 balls left.
After 676 runs in a tie against India, followed by defeat after the fastest World Cup century against Ireland, it seemed as if this encounter would be less eventful for England but for many it was the match of the tournament thus far.
Their plan to put runs on the board on a crumbling surface more reminiscent of a four-day-old Test match pitch was soon left in tatters after a destructive opening over bowled by left-arm spinner Robin Peterson, who had taken a modest 26 wickets in his previous 42 internationals.
In truth England misjudged the amount of turn in the wicket. Andrew Strauss tried to stamp his authority on the game early on but succeeded only in lofting the third ball of the match straight to deep mid-wicket.
Kevin Pietersen, who has been tormented by slow left-arm bowlers in recent years, tentatively edged one that turned appreciably and was caught low at slip. Once England's main source of runs, Pietersen has not scored a one-day century since November 2008, and in 27 innings since averages only 23.
Trott was left with the formidable task of picking up the innings, which became even more arduous after Ian Bell was deceived in flight by Peterson and the bowler superbly took a looping catch while diving to his left, making it 15-3 in the fifth over.
Surprisingly Peterson was taken out of the attack having taken 3-4 from four overs and England briefly found seam less threatening, although runs did not flow freely, the 50 arriving in the 14th over as Bopara guided only the third boundary.
Trott was reprieved on 20 after an lbw decision was successfully reviewed, and when Bopara skipped down the pitch to launch JP Duminy down the ground for six the green shoots of recovery were beginning to appear at 97-3 after 25 overs.
Both players reached 50 from 87 balls but Trott, having been dropped in the deep three balls previously, was superbly caught and bowled by leg-spinner Imran Tahir to his left.
Paceman Morne Morkel found some movement to take Matt Prior's edge, then beat Bopara with one that kept low four overs later and aside from a few boundaries from Graeme Swann the innings wound down to a slow and painful death.
Tahir again underlined his value to the shape of the South African team by exploiting the limitations of England's lower middle order and taking his tournament wicket tally to 11.
One of those, Michael Yardy, who made a painful three from 17 balls with the bat, was given the chance to redeem himself by opening the bowling as England sought to turn the tables on South Africa.
Instead South Africa had progressed comfortably to 29-0 after six overs by the time the more dangerous spinning option, Swann, was introduced.
Swann immediately caused problems and bowled some stunning deliveries, the ball jagging away dramatically from left-hander Graeme Smith (22) and eventually he was rewarded when after a lengthy review third umpire Asoka de Silva decided there was slight contact with the glove.
Only 109 were needed when Kallis, a man with more than 11,000 runs in ODIs to his name, strode out and he promptly reduced that requirement by four with an imperious on-drive to the boundary first ball.
Broad nipped one back to dislodge Hashim Amla and had Kallis caught low by Prior - but it seemed little more than making the margin of defeat more respectable.
With only 48 required James Anderson struck. He bowled the in-form AB de Villiers when a fine delivery moved away and just clipped the bails before Francois du Plessis (17) left his ground pushing forward and was run out as Ian Bell flicked the ball back to Prior from short-leg.
For a while it was all England - Anderson uprooted Duminy's off-stump and South Africa seemed incapable of scoring a run, their reputation of crumbling under pressure intensifying as a flat-footed Peterson edged Yardy into Prior's gloves.
Dale Steyn hit two boundaries in his first two overs at the crease and appeared to have restored calm in a stand of 33 with Morne van Wyk, but the latter then played on to his stumps.
But after Bresnan returned to pick up the eighth wicket it was left to Broad, back to fitness after a winter decimated by injury and illness, to apply the finishing touches to a memorable match.
The man who took four for eight in 21 balls against Australia in 2009, trapped Steyn plumb lbw pushing forward and had Morkel caught behind.
Please login to add to favorites
Already added to favorites
Added as Favorite