Terrain is created by a myriad different causes over many different time-scales. In order to truly create realistic terrain, you'd have to simulate these.
In the "short" term, the hydrosphere determines most of the characteristics. You can probably start with a voxel/particle/heightmap/mesh terrain containing major features (mountain ranges etc.) and treat it as immutable, then post-process it with a plethora of water simulations. You'll need to compute where the rivers and lakes will be, how they erode the base landscape, and where they form deposits. If I had to code this I'd probably start with a 3D voxel world.
This would be a gargantuan task and I'm sure there are lots of tricks available for generating specific terrain types that take milliseconds instead of minutes. What kind of terrain are you looking to create? Mountainous? Lowland? Industrialised? Forest? Desert? Archipelago?
Long story short: if you want terrain that looks realistic to humans (who tend to be, after all, experts on this kind of thing), you'll have to create it by simulating actual geological processes.
I've played with terrain generation before. Assuming the objective is a bitmap I found a way to make things like rivers and in general make it look better: Erosion.
Once you have terrain generated by other means erode it a bit: You need the world expressed as heights of pixels. Take a spot on the map and move one unit of height to the lowest neighbor. Move the cursor to this neighbor and repeat until it doesn't move. Repeat for other pixels.
To make rivers count the number of times you pass through a location moving bits down. Spots that get hit the most are rivers.
Followup: I wasn't eroding each pixel so much as simply a large number of random pixels until it weathered enough. The reason for actually eroding them is that this carries bits down and fills in holes. Without that there can be no rivers as there will be dead that trap the flow--the flowing pixels fill in any small holes and make working waterways.
Sorry I can't give any samples, this was many years ago and while the old code is probably around somewhere I don't know where to look.
My method in Terra3D was to generate random height values, and then make 3 smoothing passes with a little reshaping written into the algorithm. The reshaping causes the terrain under the water line to shift downwards a bit and everything above the water line shift up a bit. The effect though is a lot of hills and small lakes. And that may not be what you're looking for exactly.
However, I'm not convinced that the principal behind my method couldn't be used to get what you want. You may just have to write some more conditions into the reshaping/smoothing algorithm. For example, reducing the amount of smoothing on the terrain at higher elevations will create more of a rocky mountain appearance. And then writing a more involved smoothing (or gaussian) algorithm that stretches out further for the lower elevations could pull those lakes together to form natural rivers.
Here's the code for the terrain generation in Terra3D in case you're interested:
// GENERATE TERRAIN
for (i = 0; i < MAX; i++)
{
for (i2 = 0; i2 < MAX; i2++)
{
if (i<10 || i2<10 || i>MAX-10 || i2>MAX-10)
field[i][i2].y=0;
else
field[i][i2].y=(GLfloat(rand()%151)-75)/50+(field[i-1][i2-1].y+field[i-1][i2].y+field[i-1][i2+1].y+field[i-1][i2-2].y+field[i-1][i2+2].y)/5.05;
}
}
// SMOOTH/RESHAPE TERRAIN
for (int cnt = 0; cnt < 3; cnt++)
{
for (int t = 1; t < MAX-1; t++)
{
for (int t2 = 1; t2 < MAX-1; t2++)
{
field[t][t2].y = (field[t+1][t2].y+field[t][t2-1].y+field[t-1][t2].y+field[t][t2+1].y)/4;
if (cnt == 0)
{
if (field[t][t2].y < -1 && field[t][t2].y > -1-.5) field[t][t2].y -= .45, field[t][t2].y *= 2;
else if (field[t][t2].y > -1 && field[t][t2].y < -1+.5) field[t][t2].y += .5, field[t][t2].y /= 5;
}
}
}
}
It's sloppy code that I wrote about 10 years ago. Terra3D was a long learning process of experimentation and fumbling in the dark to produce the type of effects I was looking for. But maybe it'll help.
Spherical displacement is pretty easy, I wrote it in python in a few hours: http://code.activestate.com/recipes/576929-planet-terrain-heightmap-generator/