Running Quit is a core task repeated many times in any debugging/development cycle. Its efficiency is therefore important and yet in my set-up it is taking somewhere between 4-10s to complete. This seems excessive. Why is it taking so long and what strategies can be employed to minimise this time?
I've observed the lower bound of 4s for a "clean" Quit, 8s when all my "init" packages are loaded and sometimes >10s following a long session. I also wonder by how much this varies from system-to-system and/or version-to-version? (timings above for V12.1.1, 2018 MacBook Pro, macOS 10.15.6).
Update
As a benchmark to keep tabs on this timing, the following shows Launch and Quit times (in seconds) for both "Clean" (no packages loaded, no other notebooks open) and "PackagesLoaded" scenarios.
Hence the resolution of the above shows that the time to Quit is actually pretty consistent and reasonable irrespective of current state. Hence, anything beyond a 0.5s Quit time suggests an issue or perhaps is an indication that an automatic kernel has re-launched for some reason, possibly as catalogued in my answer.

Quit[]anyway, there is little point to this - the OS will free that stuff much faster in bulk. The saying goes "don't clean the dishes as the building is being demolished". However, design-wise it's probably hard to avoid because calling destructors is also necessary to prevent memory leaks while the kernel is up and running. – flinty Aug 14 '20 at 15:19Quits having those two packages (un)loaded? – Ronald Monson Aug 14 '20 at 15:52Quit[]take if your init.m is empty and you start from a blank notebook? – flinty Aug 14 '20 at 16:19Quit[]command ? If not, then see this answer which suggests to me you may still have something running in the evaluation queue. – flinty Aug 14 '20 at 16:36$InitializationContextssetting. Look I'll stop now and I'd better go and try a few more things - thanks for your input - it has given me some ideas to test. – Ronald Monson Aug 14 '20 at 16:55