The part of updating through the UI that I think is unreliable is stopping and starting the cf service, which in turn may lead to other problems.
I'm not 100% certain that's what caused the problem with multiple log4j versions, but I my bet is that the older version's files couldn't be removed by the installer because it ran while the cf service was still running.
Installing update 4 worked perfectly from the cmd line, as it always has for me since I started doing updates that way. I did this update on a second 2021 server, on the cmd line, and it too worked perfectly, without the log4j sideshow.
Here's the process I use, FWIW:
1. Download the update jar through the UI. It will probably end up in <cfinstallrootdir>\bundles\updateinstallers\. If not, move it there, or adjust these instructions accordingly.
2. Stop all cf services.
3. Copy the cfusion directory somewhere as a backup (optional).
4. Open an admin cmd prompt.
ADJUST THE NEXT STEPS TO YOUR ACTUAL PATHS AND HOTFIX FILENAME
5. Type or paste this into that cmd prompt and press enter to run it:
<cfinstallrootdir>/jre/bin/java.exe -jar <cfinstallrootdir>\bundles\updateinstallers\hotfix-004-330004.jar
6. When it finishes, you can check the site and cf admin. HOWEVER, the installer will probably have started a new process under your own account, you don't want that, so:
7. In that admin cmd prompt, cd to <cfinstallrootdir>\cfusion\bin, type cfstop, and press enter.
8. Wait for that cmd to complete, then start the Windows Service normally.
9. Test the site and cf admin.