Opener Richard Levi led the way with a quickfire half-century to set the Proteas well on their way to overhauling their below-par victory target of 125 - a task they duly completed with 2.2 overs to spare.
The result saw both teams secure places in tomorrow's final at the same venue. The tournament's third team, Bangladesh, had needed either a Zimbabwe win or a South Africa win by a big enough margin to get them through on net run-rate.
Zimbabwe won the toss and opted to bat first against a South Africa side reeling from having lost their last two games, but the hosts never really got going.
Hamilton Masakadza and Graeme Cremer were joint top-scorers with 36 apiece, with Stuart Matsikenyeri (22) the only other home player to reach double figures in their total of 124 for six.
Left-armer Wayne Parnell was the pick of the Proteas' bowlers with three for 16 from his four overs.
South Africa's response got off to a poor start with captain Hashim Amla dismissed in the first over for a first-ball duck, caught behind by Brendan Taylor off Chris Mpofu.
But fellow opener Levi fared much better and blasted 54 off just 30 deliveries - including four fours and four sixes - before being run out by Mpofu.
His departure left the South Africans on 88 for three just past the midway point of their 20 overs.
Justin Ontong (24) and Farhaan Behardien (19 not out) looked set to ease the Proteas past their victory target, but the former fell on 122 and it was left to Albie Morkel to hit the winning runs. And he did so in style with a six over wide mid-wicket off Matsikenyeri.