The mirror modifier is designed to work properly with the subsurf modifier. You shouldn't have to do anything extra.
The main problem is that your subsurf modifier is above your mirror modifier in the stack. The subsurf should be below the mirror modifier.
Essentially, you're suburfing one half all by itself, and then mirroring that. Rather, you want to mirror the part you have, and then subsurf the whole thing.
If that doesn't fix all of the problems, there are some other problems you might be running into.
Normally, the mirror modifier will merge vertices from one half that are close enough to the save vertices from the other half. You just have to make sure of two things:
- Your center line must be perfectly straight.
- Your center line must be close enough to the mirror pivot.
To make your center line perfectly straight, select all the vertices that are on the center of your mesh and scale to 0 only on the proper axis. If your center line parallels the x axis and lies on the x-y plane, then scale to 0 on the y-axis.
To make sure your center line is "close enough" to your mirror pivot, first determine what your mirror pivot is. The default is the object's origin, but you can use the origin of another object. In your case, it's probably the object's origin. Here's a method you can use:
- Select all vertices
- Zoom in on the object's origin (orange dot) and move all the vertices until the center line lies exactly on the origin.
You may have to zoom in very far to get it perfect, but you really only have to get "close enough" as defined by the merge distance set in the mirror modifier.
It's best to move on a single axis, which you can do after starting the operation, in this case
grab. After typing g, type the letter of the axis along which you want to move the vertices. You'll be constrained to this axis until you choose another one, or finish the operation.