The hosts will now meet Australia in the tournament final at the same venue on Sunday.
Left-hander Bravo made 102, including 12 fours and four sixes off 103 balls, as his third one-day ton lifted West Indies from early trouble at 21-4 to 285 all out off 49.5 overs.
He shared a record fifth wicket stand of 156 with Kieron Pollard, who chimed in with 62 off 71 balls, including seven fours and two sixes.
South Africa’s chase was undermined by the fiery Gabriel as the visitors were bowled out for 185 in 46 overs.
Spin ace Sunil Narine supported well with 3-38 and all-rounder Carlos Brathwaite took 2-39.
Gabriel, bowling consistently near 150 kilometers per hour, provided the crucial early scalps of Quinton de Kock, Faf du Plessis and A.B. de Villiers as the Proteas slumped to 28-3.
De Kock chopped an inside edge to the wicket-keeper Denesh Ramdin, du Plessis was lbw and de Villiers edged a drive.
Narine soon claimed Hashim Amla lbw and captain Jason Holder had J.P. Duminy fending to gully at 51-5.
Farhaan Behariden top-scored with 35, Wayne Parnell contributed 28 and there was a late flourish by the last pair of Morne Morkel (32 not out) and Imran Tahir (29) but there was no way back for South Africa.
Earlier, the tourists dominated the first half hour with left-arm seamer Parnell claiming the early scalp of Andre Fletcher to a wicket-keeper’s catch.
But it was the 21-year-old Rabada, who took 3-31, that really silenced the home crowd as the hosts top order slumped.
Johnson Charles edged to second slip and Marlon Samuels, fresh off a century against Australia, was yorked first ball. Ramdin soon lost his middle stump and South Africa was in control.
But Bravo, who survived a difficult catching chance at fine leg by Parnell off Morne Morkel when 11, rebuilt the innings with fellow Trinidadian Pollard.
The pair’s stand was the best for the West Indies for the fifth wicket.
Pollard eventually holed out to long-on off Morkel.
Bravo brought up his century with a six over long-on off Chris Morris before was the victim of an excellent running catch from Faf du Plessis as he mis-hit the same bowler.
Captain Holder, with 40 off 46 balls, and fellow all-rounder Carlos Brathwaite, 33 not out, boosted the lower order in adding 54 for the seventh wicket.