As noted below and explained in detail at unix.stackexchange.com/a/196014/5132 , the premise of this question is false on systemd Linux operating systems. These are not different binaries on such systems.
–
JdeBPApr 14 at 9:47

In addition to what iconoclast wrote, there's an important distinction between the two programs: shutdown is in /sbin, while reboot is in /usr/bin.

Why does this matter, you ask? I will tell you.

Things under /usr are those that do not have to be available until the system is booted up far enough that the system is minimally functional. Top-level directories that are traditionally never mounted on separate filesystems — /bin, /etc, /sbin, etc. — are expected to be available while the system is reaching this minimally useful state. There are various implications of this design; for instance, it is bad style to write the "stop" clause of a SysV init script that uses programs in /usr/bin if there is an alternative in /bin or /sbin.

shutdown is the key utility, the one always available. reboot is a convenience utility only.

Indeed, on systemd Linux operating systems neither is the key utility, as with systemd all of these commands are (as the systemd doco has it) "compatibility" commands. Indeed, the premise of the question is false. They are not in different binaries. For details, see unix.stackexchange.com/a/196014/5132 .
–
JdeBPApr 14 at 8:04

The two commands do something different, however they can end up calling each other, which is why they seem to do the same thing!

reboot will invoke the kernel to actually trigger a hardware reboot. However, it will only do this if the system is ready for shutdown - all daemons and user processes should be stopped, file systems unmounted, etc. So it checks the system runlevel, and if it's not 0 or 6, then it will actually invoke the shutdown command for you.

shutdown causes the system runlevel to be changed. The runlevel change (to 0 for halt or 6 for reboot) runs lots of scripts in /etc/rc0.d or rc6.d that shut down daemons, unmount filesystems, etc. Finally these scripts invoke halt or reboot - this time the system is in the correct runlevel and they instruct the kernel to reboot (or halt).