IMO Systemd Timers provide much better control over how the cron job is run.
Need to distribute lots of cron jobs evenly to avoid overloading the system? Use RandomizedDelaySec.
Some cron jobs are flaky and you want to re-run if it fails? Add Restart=on-failure to corresponding service.
Some cron jobs conflict with each other? Set Conflicts=foo.service or maybe Before & After.
Sure, all above are possible with shell scripts. But systemd provides a standard, reliable way to define these properties.