While the goal of launchd was noble (provide a replacement for SystemStarter/SysV/cron/etc.) it's execution is very flawed. For example, if you make a mistake in your configuration, you will just get a generic error. Program arguments have to be as a list for some reason. There is no restart command. Service loading and unloading (as in the config files, there is no reload command) has to be done with absolute paths, which is annoying because the paths are like "sudo launchctl unload /Library/LaunchDaemons/party.soyjaks.sci.foobar.plist"
The worst thing is that launchd could have been good if they added QoL improvements like restart, reload, etc. and ditched the XML for INI, which is basically what systemd is. systemd is basically a fixed version of launchd.
The UNIX service system in general is a mess because it is a hack forking programs to the background to start them and killing them to stop them. Compare to the NT solution of just having services as DLL files that use a services API and are hosted by svchost.exe, which while more complicated to implement, makes more sense and appears to be working fine as it has not changed significantly since the first release of Windows NT in 1993. However, his comes with the drawback of not being able to run arbitrary programs as services but this is fixed using shim programs like NSSM or RunAsService which will allow you to run mspaint.exe as a Service, whatever that is supposed to mean.