adb reboot vs adb shell reboot
No difference. Ultimately both set sys.powerctl property to reboot,&lt;reason&gt; (1, 2). init then handles the property to proceed a proper shutdown or reboot (3). reason string optionally describes why the device was rebooted (see persist.sys.boot.reason property after reboot).
When executing adb shell reboot you make adb run shell: /system/bin/sh which then executes /system/bin/reboot binary. You can also set the system property manually:
~$ adb shell setprop reboot,just_testing