I believe most of these older games simply “sweep” a sphere, or a kind of virtual stack of spheres forming a pill, against the mesh. Sometimes they do a trick to stretch a single sphere into an ellipsoid, but I would stick with the pill. Also they may use a septate physics mesh, in fact it's likely.
If you're implementing it yourself, you want to check the sphere(s) vs each triangle. You fist check the face, then the 3 edges and finally the 3 vertexes. If it misses all 3 then you didn't collide with that triangle. As an optimization edges and vertexes that are shared between triangles you only need to check once. You also need “collision response”. For instance if you hit a wall at an angle you want to slide along the wall rather than just stopping. In fact walking on the ground is really just sliding your bottom sphere along the ground.
There are also double collisions where you collide with more than one face at a time. I take the cross-product of both collisions and generate a new vector for the response. As an example, say your character is walking up a little V shaped valley.
There are a lot of little things to worry about. For instance its really possible to collide with many tris at once given certain geometry. I wrote a routine that picks the best pair to do the above double collision calculation on. It does dot products with all possible response vectors (generated by cross-products or single collision responses) , and a vector in the direction you are tying to go, and then picks the closest solution. This is a rare situation however.
Gravity is just an additional downward acceleration you apply. To keep things reasonable you can have a max speed for that. Gravity is used whenever you aren't touching the ground, or when you are touching it at an oblique angle such as on a steep hill. In that case you may want to slide down the hill. This kind of naturally gives you the behavior that you can't walk up a very steep hill. Also when you jump, you just apply a bit of upwards acceleration and then let your gravity system take over. Keep in mind that the animation itself has nothing to do with the physics, at least until you get into Inverse Kinematics. I don't think WoW does that, or at least it didn't used to.
Finally you need to organize your physics mesh into some sort of data structure that lets you find tris with possible collisions quickly. I use an octree.
If all this seems complex, it is a bit. It took me quite a while to get my stuff working. But I will say the math isn't too hard. It's mostly dot products and cross products.
You also have the option of just using an off the shelf physics engine like bullet. I'll let someone else advise you on that since I haven't used one. That's probably a much easier rout. One minor advantage with sweeping spheres is that you can't go through your geometry no matter how fast your character is moving. It will always find the perfect collision (assuming no bugs). I've been told that with a lot of physics engines, that can be an issue, but for character running speeds it may not matter.