Some clarification is necessary here, I think.
So, Linux the last… 15 to 20 years or so, have tirelessly been working on this graphics project called Mesa.
https://www.mesa3d.org/
Mesa is truly an awe-inspiring engineering feat of Open Source, because not only does it provide a full Open Source implementation of most graphics libraries out there (most prominent are Vulkan and OpenGL), it also does this with both hardware and software based backend renderers.
Back in the early days, Mesa was known as that software rendering kid that did some neat stuff but was probably never going to catch up to the big biz render stacks from GPU vendors that ran your games at a whopping 3000 FPS while Mesa could do 15 FPS on a good day with a state of the art 2GHz Pentium 4 single core machine. It wasn’t even a contest.
Mesa, however, had two things going for it; One was that it was Open Source, which meant it was extremely simple to debug and test. And the other was that it was built in a way, that made writing kernel modules that ran on Mesa easy. A module written for Mesa only needs to transfer a bunch of calls from the Mesa libraries to the hardware registers. But the actual shuffling of memory space… That’s handled by Mesa.
So what did the competitors do? They wrote the kernel drivers PLUS their own graphics libraries that did the same thing Mesa did, sometimes better, sometimes worse. Since Mesa lacked hardware acceleration however, that did not really matter. It was a dead end.
Then, something amazing happened, AMD (then ATi) and Intel started to open source their kernel modules. Sure, at first it was just the modules hardwired into their respective ecosystems, but this all of a sudden allowed for Mesa drivers to also be written. And in the beginning… Boy did they suck! But it was a start.
Where does Nouveau fit into all this? Well, some Nvidia users wanted a free implementation that could one day utilize the Mesa render chain, for goodies like easier debugging. This was a reverse engineered process and it was kinda like trying to pull stalagmites out of a mountain with a pair of pliers, but hey, while progress was slow at least there was progress.
So, what does this mean for the kernel? Well, basically you now have two render paths for Nvidia:
Game Rendering Engine → Nvidia OpenGL implementation → Proprietary kernel module → Pretty pixels on screen
Game Rendering Engine → Mesa OpenGL implementation → nouveau kernel module → Pretty pixels on screen
Hope that made things clearer!