My personal laptop (which is basically a fixed wokkstation since its keyboard is broken) I update right after I get up, it updates while I fetch my first coffee. After I get home from work, it feels already out of date and I at least check for updates. For some software I get notified about updates, and when I see such a notification I run updates instantly (I build local “forksd” of upstream packages then for which I bump the version manually). Since I use Arch Linux those local “forks” are easy to do and get usually replaced by upstream builds pretty quickly.
For the machines I use at work I usually update only during cool down phases, as I can’t afford debugging breaking updates on those machines, though rarely things break, on linux at least… My windows host doesn’t have a startmenu for 3 months now… (and according to our internal IT its in an invalid update state inbetween the last and the current big feature update)
In general, I do not expect things to break, but I prefer to be prepared and careful on machines I actually need.
I used to do upgrades for point releases (of macOS) then do a completely clean format (as per this guide) for every major release. However, Apple made it pretty tough transferring all your data over manually, insisting you use Migration Assistant so I stopped doing clean formats. However I have got back into it now as Migration Assistant messed up a recent migration (4 times no less!) and tbh, I am quite glad - things just feel better after a completely clean wipe.
With regards to production environment, I just upgrade to versions I need or security upgrades (preferring stability over bleeding edge whenever possible).