Use std::string always, don't even think about using anything else. It will work everywhere, even on my AIX system which is so backwards like an dinosaur (well it's actually so because IBM is a dinosaur)
You CAN use char* for extremely speed sensitive system functions, but for user code it's always string which you should use. In system programming you have to use pure C anyway, since every nanosecond of delay matters. That's why it's also good to mix C with C++ code for cases where you know exactly that it's an abstract code and does not fail with infinite amount of data.
A game engine is not system programming, so you can use C++ and STL freely.
Making an own String class will give you a slower string class, since STL has been insanely well optimized over years. Even a normal QuickSort routine is slower than STL's built-in sorting functions, because STL switches automatically between different sorting algorithms according to the data type and structure you want to sort.
It may also be that some C++ compilers are especially optimized to provide maximum performance with STL classes, so no custom classes can ever beat that.