You mention responsiveness… immediately that implies either multitasking on a fast multi-threaded processor, or well written NON-BLOCKING code.
Sorry, no entry level developer wants to hear that. because they can’t just throw code, they have to plan it.
Using millis() etc, isn’t hard, but you must think.
It’s a bit like not using ‘go to’ - because that implies you have to ‘get out’ of a dead end in the code.
Well written code shouldn’t be able to lock up for any period of time, using states and flags to arbitrate the flow of the program.
If one software routine isn’t doing something, every other routine - should be able to - if they want to, at that moment in time.