Oh, for the umpteenth time: This is an unsolved problem we’re talking about. Every solution you’ll find for the problem requires knowledge of the terrain in advance. NMS doesn’t have that.
Even letting the stream carve out a canion isn’t a feasible solution, because there might not be any terrain to carve out. Let’s say you have a ditch. So that fills with water. Fine, no problem there, all localised, you get a small lake (expensive in CPU cycles, though). Where does the water leave the ditch to flow onwards? At the lowest point of the ditches rim, of course. Pretty simple.
Now answer me this: How are you going to know where the water will flow through if a) you don’t know that there’s a ditch in its path, and b) where the lowest point of its rim is? That’s right, you can’t. Just simply C.A.N.T.
So what can you do? Well, you let the course of the river be determined by a mathematical function instead, as everything else. Now you always know where the river is flowing through, right?
But oh wey, now there’s a ditch in its path, and the ditches lowest point happens to be not where the river is determined to flow. Great. Now you have a magic water wall.
What could we do about that? Well, we might locally edit the terrain to form a river board. Now we’re having an additional expensive layer of post-generation that needs to analyse the terrain first, so good bye PS4 and Xbox, but at least it works.
That is, until there is a giant canyon intersecting the stream perpendicularly instead of just a ditch. So now the water falls into the canyon in a majestic waterfall, flows right across the canyon, and burries itself a completely illogical cave at the other end instead of following the canyon, which would have been natural. Ok, fine, I guess we can live with weird things like that. Except, now I scale the canyon wall on the side where the river flows underneath and walk a ways. After a while, the game doesn’t know anymore that there is a canyon back there. So… How on earth does it know that the stream runs underneath the surface, and not on the surface? After all, if the canyon wasn’t intersecting the flow, the river would just have continued flowing naturally across the surface. So since we now don’t know that there is a canyon, that’s obviously how things should be. And we get an entire river magically popping into existance on the surface. Until you walk back to the canyon, when it just as magically disappears again because it realises that it should run at the level of the canyon floor. Big whoops.
So let’s not do waterfalls, because any waterfall will inevitably break the flow of your procedurally generated river, because its flow must be generated without knowledge of the terrain its flowing through. You’re left with spontaneously generating in some kind of natural aqueduct to carry the water over the canyon, or generating some weird basin walls crossing the canyon so part of it can fill up and become a rather weird lake. In any case, we now officially banned waterfalls, because there was simply no other joice, so we achieved nothing, because people will keep asking why there’s no waterfalls.
I’m not claiming the problem is unsolvable, mind you. But as of right now , again, it is unsolved, and if a solution exists, it has to be so out of the box and bat-shit bonkers that nobody thought of it yet.