In what became an absolute thriller of the match, Denesh Ramdin's boundary with three balls remaining saw the Windies finally get over the line, chasing down a total of just 123 set by South Africa.
The result leaves South Africa relying on other results for them to have any chance of a final four spot, after they had crumbled to 47-5. They were saved by a solid partnership from Quinton de Kock and David Weise, but it proved to be to no avail, as the West Indies rolled on to claim their third straight victory.
Proteas rocked early, crumbling to 47-5
After playing their first two matches in this competition on a batting paradise in Mumbai, the move to Nagpur looked to be a huge wake-up-call for the South Africans, who found themselves 47-5 inside ten overs.
The first man to go was Hashim Amla, who was run-out for just one in the opening over of the match, after a mix-up with de Kock.
The captain, Faf du Plessis came and went quickly after an excellent catch from Suliemann Benn, with Rilee Rossouw following in the next over for a duck, after playing a dreadful shot off the bowling of Chris Gayle.
After a period of slight consolidation, another mini-collapse held the Proteas back once more, starting with the major wicket of AB de Villiers, who was bowled for 10 by Dwayne Bravo. Then, in the following over, Gayle picked up the second of his unlikely wickets, when he bowled David Miller for one, leaving South Africa 47-5 after 50 deliveries of the innings.
De Kock and Wiese guide South Africa to 122
With their backs against the ropes, South Africa fought back well, eventually ending their innings on 122-7 from their 20 overs after being inserted by Darren Sammy.
The partnership of de Kock and Wiese accounted for 50 runs in just over seven overs, and included some excellent running between the wickets to give the South Africans some momentum in their innings. Both men then fell to Andre Russell and Bravo respectively, as the West Indies death-bowlers fought back to keep the total in check.
Aaron Phangiso was run-out off the final delivery, as the West Indies managed to restrict their opponents to just 10 runs from the final 16 balls, setting themselves a target of 123.
Rabada knocks over Gayle, before Samuels hits 43
If South Africa had any chance of defending their paltry total, then they knew they had to dismiss Chris Gayle early in the chase, and that is precisely what they did.
In the opening over of the reply, Kagiso Rabada bowled a delicious in-swinging delivery which caught Gayle on the crease, knocking over his off stump to see the big man on his way for just four.
A strong second-wicket partnership between Johnson Charles (32) and Andre Fletcher (11) was then formed, before Fletcher was run-out in comical fashion to leave the Windies 34-2.
That wicket bought Marlon Samuels to the crease, and after a slow start, he eventually played what turned out to be the match-winning knock. His 43 came off 44 balls, but he allowed other batsman to play around him, although they all decided to give their wickets away playing foolish big shots on a slow pitch which brought South Africa back within touching distance of victory.
Brathwaite launches massive six, followed by Ramdin's winning runs to book semi-final spot
As wickets continued to tumble, including that of Samuels for 43, it looked more-and-more likely that the West Indies would fall short of the target as the required run-rate creeped past 10-an-over.
It was eventually left to Carlos Brathwaite and Ramdin to pick up nine from the final over off of Rabada who had built up a real head-of-steam.
After swishing at the first delivery, Brathwaite then launched an almighty 101-metre six, which was followed by a wide and a single to leave the West Indies needing just one run from three deliveries.
Ramdin answered the call, cutting the short ball just out of the reach of Amla's reach for the winning runs and to give the West Indies their third win on the bounce. South Africa now need England to lose to Sri Lanka on Saturday to have any hope of qualification, with an England victory seeing them join the West Indies in the semi-finals.