I use the following rule of thumb:
cron: use it if I want a task to *repeat* on a schedule (or at boot)
at: use it if I want to run a job *once* at some absolute imprecise time (IIRC, at has a 5min resolution) in the future
sleep $(( 60 * 5 )) && cmd: use it for a task I want to run *once* relative to the current time
systemd timers: avoid anything systemd to the best of my ability
๐