Ok, it’s been about a week since I last updated this thread, so I want to take a moment to document what I’ve done since then.
TL;DR I have not experienced the problem since trying these steps. I hesitate to confirm resolved as the issue felt sporadic.
Taking @hydn’s and @IronRod’s advice, I decided to purge all of the installed Nvidia packages to get just the Nouveau drivers in place. To get that done on this machine, I ran: sudo apt purge nvidia*. It did seem to leave two other packages behind so I forcibly removed those with sudo apt purge linux-objects-nvidia-595-6.17.0-23-generic linux-signatures-nvidia-6.17.0-23-generic. I also checked dpkg for any rc nvidia packages with sudo dpkg --list | grep -i nvidia, which there were. I removed those with: sudo dpkg --purge libnvidia-compute-590:amd64 linux-modules-nvidia-590-6.17.0-20-generic linux-modules-nvidia-590-6.17.0-22-generic linux-modules-nvidia-590-open-6.17.0-20-generic linux-modules-nvidia-595-open-6.17.0-23-generic linux-objects-nvidia-590-6.17.0-20-generic. I probably could have left those, as I understand rc to mean there are residual configuration files only, but, I wanted this to be as clean as possible along with a clean slate for troubleshooting.
I then rebooted the laptop. It hung after showing the Zorin splash screen (never got to the desktop), so I powered off and back on again and got to a login screen. I tested launching a few games like Minecraft and Steam, and then used nvtop to see which GPU was being used. On that note, this is something that I should have explicitly mentioned before, the laptop has two GPUs. An integrated AMD GPU and a dedicated Nvidia GPU. nvtop showed me that only the AMD GPU was in use, and I believe it was the only one recognized as well.
I’m not sure if Nouveau can be toggled for GPUs like with Nvidia’s prime-select, but I did leave the laptop on with some processes running overnight and no hangs/freezes. Using the integrated GPU was a huge hit on performance that I wasn’t happy with, so I opted to re-install Nvidia drivers but with pinning.
To do that, I downloaded the cuda-keyring_1.1-1_all.deb package from the Nvidia instructions and installed it with sudo dpkg --install cuda-keyring_1.1-1_all.deb. I then ran sudo apt update and confirmed the presence of https://developer.download.nvidia.com in the list of sources.
I then ran: sudo apt install nvidia-driver-pinning nvidia-driver-pinning-595.58.03 nvidia-driver-open xserver-xorg-video-nvidia-595. I chose these packages based partly on Nvidia’s install instructions and comparing the previous dpkg --list command. These installed some dependencies (expected) and all were successful.
After a reboot, I wanted to test the same games (Minecraft + Steam games) to see if the Nvidia GPU was 1) being detected and 2) being used. Using nvtop showed me both GPUs, but the AMD GPU was still the only one being used!
To resolve this for Minecraft, which I use the MultiMC launcher to manage, I adjusted the Exec= line in the multimc.desktop file using menulibre to be: Exec=env __GLX_VENDOR_LIBRARY_NAME=nvidia __NV_PRIME_RENDER_OFFLOAD=1 /opt/multimc/run.sh. This makes it so neither of us has to remember to right-click on the desktop icon and choose “Launch with Discrete GPU”. After making that adjustment, nvtop confirmed Minecraft was running on the Nvidia GPU.
Steam, on the other hand, was always running all games on the AMD GPU, regardless of what launch options I gave to the shortcut or the specific game. Then I remembered, I installed Steam with flatpak on this laptop. So I ran a flatpak update, which installed two packages: org.freedesktop.Platform.GL.nvidia-595-58-03 and org.freedesktop.Platform.GL32.nvidia-595-58-03. Games now run on the Nvidia GPU from Steam!
So far so good. Leaving Steam open overnight, or leaving a browser open all day, it doesn’t seem to matter. No freezes or hangs and the performance is good. I did consider installing nvidia-prime to get the prime-select command back, but, that wanted to uninstall several packages, and I’m not sure why. Now that things are working, I’m hesitant to poke the bear and break things.
If there is a way with Nouveau to detect another GPU and/or force the usage of that GPU, I’d love to know in case I need to do more testing in the future. Sorry for the long ramble, but, hopefully this can either 1) help someone else or 2) someone can tell me if I’m doing something very wrong where I’m causing my own issues.
Once again, thanks to @hydn and @IronRod for pointing me in the right direction!