JNB is fine, it's where I grew up. Just use common sense, if an area or situation feels suspicious, move along... try not to a act like a tourist.
There are several budget airlines that have flights between JNB and CPT:
• Kulula Airlines
• Mango Airlines
• OneTime Airlines
Don't bother with rail service.