Really? It shouldn't be possible; there's no code in the current gdnsd capable of reloading the config at runtime, so a full restart should be necessary.
Full restarts are relatively inexpensive, though. Some pains are taken to overlap the startup delay of the new daemon while the old continues to run, but it's not yet perfect (some buffered requests can be lost during a brief window) and it doesn't work if running as a systemd service.
I have a local branch I've been working on sporadically over the past few months which will implement a "reload" verb that (from the outside point of view) reloads the entire config without any requests lost, and works correctly regardless of running under systemd or not.
Internally it's implemented as a full restart via execve() with some tight communication between the old and new instances, and the sockets are handed off from the old to the new with overlap (for those listening sockets common to both the old and new config). This also means reload can be used to upgrade the running version of the installed binary seamlessly as well (assuming I don't manage to break compatibility...).
There would still be a separate "restart" mechanism that works much like the current one: more chance of a few lost buffered packets, but it's much simpler and more robust restarting mechanism, in case the more complicated "reload" mechanism gets its compatibility broken in a version upgrade, or has bugs.
It wasn't ready in time for 2.2, but hopefully it will be the primary feature in the 2.3 release.
-- Brandon