Answer
Apparently, the mesh lines generate points which are too close to the triangle vertices, and VRML is not being able to handle them correctly.
To prove the theory, try the example without meshes:
p = ParametricPlot3D[{(2 + Cos[v]) Sin[u], (2 + Cos[v]) Cos[u],
Sin[v]}, {u, 0, 2 Pi}, {v, 0, 2 Pi}, PlotStyle -> Red, Mesh -> None];
Export["test.x3d", p];
It should look OK using FreeWRL:

So the possible solution is to isolate meshes from the surface, i.e. generate them separately and let them be two different graphics complex so that they wouldn't share any points.
We already know how to generate the surface without mesh. To generate only meshes, this would do it (plotting with PlotStyle->None
):
p2 = ParametricPlot3D[{(2 + Cos[v]) Sin[u], (2 + Cos[v]) Cos[u],
Sin[v]}, {u, 0, 2 Pi}, {v, 0, 2 Pi}, PlotStyle -> None]
The result is:

Now, combine those two using Show
and export.
Export["test.x3d", Show[p, p2]];
The result is perfect:

Now, you got your wholly donut back. Enjoy!
Note: I am using Windows version of FreeWRL so the result may be different on other platform. In that case, it may as well a bug in FreeWRL, not Mathematica's problem.
Bonus
OK. I shouldn't advocate the use of undocumented features. But if you really want more solid looking meshes, not shamble lines (many format/renderer is not so great at pure line drawing, more so with 3D printing...), this syntax may help you: MeshStyle->Tube[thickness]
(thickness in user coordinate scale).
For instance:
p2 = ParametricPlot3D[{(2 + Cos[v]) Sin[u], (2 + Cos[v]) Cos[u],
Sin[v]}, {u, 0, 2 Pi}, {v, 0, 2 Pi}, PlotStyle -> None, MeshStyle -> Tube[.02]]
will create:

Disclaimer There is no guarantee that the syntax will work on the future version of Mathematica. So if you value compatibility, you should not use this. But the resulting 3D graphics will be always valid since it is using our Tube
primitive. Tube
is supported for export formats. For instance, if you export it to x3d
:
Export["test.x3d", Show[p, p2]];
(It may take quite a while, since Mathematica is converting tubes into polygons for compatibility during exports), the result will be:

Again, it is not a permanent solution but if you really need better mesh lines for export or 3d printing, it will give you a temporary relief.