My terrain at the moment can cope with a 512x512 heightmap quite comfortably (~40 FPS when rendering the whole thing - about 500k triangles), and a 256x256 terrain runs nice and smoothly.
I take all of the height values, and break them into 33x33 vertex chunks. I cull the chunks against the viewing frustum, so I don't render chunks that aren't visible.
I have several vertex buffers of up to 65536 vertices, and one dynamic index buffer. Each frame, I loop through all of my terrain chunks, and if it's visible, I get it to draw itself into the index buffer.
That works fairly well, but I'm still rendering high resolution chunks if they're miles away from the camera. I'm probably going to use geomipmapping, or something similar, since I have Game Programming Gems 3, which has a gem on it (or is it GPG2? I don't know, I have 1-4 anyway) and it seems fairly easy to get to grips with.
Anyway, here - have some screenies:
Now I'm off to try and optimize it a bit...