With millis() you can do everything at the same time, independent of each other.
There are other options:
- The Schedular for the SAMD processors works very well. You have to be careful how to assign enough stack space for each task and you have to keep in mind when using common variables or devices that others tasks could use them as well.
- The ESP32 runs FreeRTOS, that is a full multitasking environment.
Using millis() requires a certain way of thinking. A existing sketch needs often to be rewritten all over. Andreas Spiess says it is like wearing your shirt inside out:
However, millis() can also be fun.