For SAMD you can achieve quite low power operation using the RTC to generate the system timer.
A low power timer (32k clock source) is a good alternative in any case as you can keep time moving through low power modes, plus you get a single clock speed running the time that doesn't change or depend on a 'ticks per second' define (as is used in the zephyr project which means your time is based on one cpu speed that cannot change).
For a sam with a rtc in 32bit count mode, you get ~36 hours to work with at highest resolution (~30us, plenty good for general use), and by also keeping track of overflows you get a system time that never rolls over.
//using a time stamp, manually checking time
led.on(); //on for 10 seconds
auto t = now() + 10_sec;
while( now() < t ){}
led.off();
//blocking wait in low power mode, default low power mode is standby, uses rtc compare to wake
while( true ){ wait(1_sec); led.toggle(); }
//wait random time between 100ms/2sec
while( true ){ wait(100_ms, 2_sec); led.toggle(); }
The above code works the same when using an avr0/1 series for example with its rtc peripheral (16bit). The details are a little different like available low power modes and the timer width, but the app code will look the same. There is usually a low power timer in the modern mcu that is typically unused.