You can still get this experience by trying to do some things the old ways. One that's come up to me recently: program an ATMega328 (the famous Arduino chip) in assembly to output a waveform with tight timing requirements.
That is, as opposed to using a timer interrupt or a delay routine, arrange instructions so that the processor naturally gets to the instruction to change the output pin at the correct time, within the acceptable tolerance. These processors have no caches or predictors so instruction timing is reliable.
I think people are doing it these days on the Raspberry Pico chips, but any "old school" microcontroller will do.