SuperSport United midfielder Dean Furman was named captain for the encounter, while Darren Keet was handed a start between the sticks.
The South Africans carved out the first real opening of the half after 17 minutes when Reeve Frosler's cross found Aubrey Modiba, who forced Lando Mavanga into a fine save.
Just over 10 minutes later, Keet came to Bafana's rescue with a fine save to deny Angola's Djalma Campos from distance.
Campos was not to be denied in the 31st minute as he pounced on a back pass by Buhle Mkhwanazi and fired past Keet to put Angola ahead.
Sifiso Hlanti looked to restore parity for Bafana with three minutes remaining in the half, but his long range effort sailed over the bar as the visitors went into the halftime break trailing.
Lebogang Mothiba brought the South Africans level five minutes of the break with with a back-heel from close range.
Bafana went in pursuit of a second goal, with Hlanti and Mahlambi threatening down the left flank.
With 20 minutes remaining, Baxter introduced Ryan Moon and Siphesihle Ndlovu for Mahlambi and Modiba as they pushed for a second goal.
Bafana nearly took the lead with seven minutes remaining when Themba Zwane's corner found Moon, whose header went just wide of the post.
That proved to be the final chance of the half as the encounter ended 1-1 and the match had to be decided by a penalty shoot-out.
Bafana held their nerve to win the shoot-out and will now face Zambia in this weekend's final.
Bafana: Bafana: Keet, Frosler, Madisha, Mkhwanazi, Hlanti, Furman, Zwane, Zungu (Vilakazi 86'), Modiba (Ndlovu 72'), Mahlambi (Moon 70'), Mothiba.
Angola: Lando, Daniel, Bartolomeu Quissanga, Gaspar, Carneiro, Cafumana, Carmo, Estevao, Campos, Afonso, Felix.