Fundamentally it's the T-junction problem. Anywhere you have a T-junction one side will have a straight edge while the other side has two edges. That introduces gaps, holes, non-linearities, non-smooth shading and lighting, and other rendering issues.
The ideal solution is to not make T-junctions. It completely avoids the problem.
It is usually possible to adjust your tessellation system to not produce T-junctions in the first place. Choose edges that don't create a T-junction.
If you are subdividing and keeping a regular grid mesh, always keep adjacent levels between one LOD and split them internally to the quad, ensuring the outside edge remains a straight line with it's neighbor. A difficulty with this system is neighbors cannot differ by more than one level, otherwise gaps must follow.
If you're using a tessellator that moves points or creates a TIN (Triangular Irregular Network), ensure it moves a large enough distance to avoid a degenerate triangle, then introduce a triangle that fills the gap.
The other solutions mentioned, adding skirts or under-layers or slight overlaps, you can still use them for other purposes. They're not particularly expensive and can be good to hide a number of other modeling sins/errors as well.