I run NixOS as a daily driver and on a box for docker containers. I will say that it is stable to point that since nothing seems to ever really break, I don't feel I really understand the configuration as well as I could (since I'm not having to fix things and learn).
I started with just traditional NixOS but later moved to using flakes. Because of flakes input pinning, it's much more reproducible but also even more stable. The biggest benefit I see to flakes is the use of local git for updating. Since I have git logs for auditing, if something were to go wrong, I'd just find that change in log and revert to before that commit hash (or just revert to different generation).
The biggest problem I've had is how procedurally some tasks change and sometimes are made more difficult. Symlinks is a good example of that. In Arch, symlinking is just a basic one-liner. In NixOS, it's a matter of writing config more verbosely to the configuration.nix file :
(pkgs.writeTextFile {
name = "tst";
destination = "/bin/tst";
executable = true;
text = builtins.readFile ./scripts/tst;
})
That's a good takeaway from NixOS: things are more verbose in setup, but tend to get set once and never again.