This is one of the best solutions I have seen so far without using plugins. It is also used by the PayPal module.

**MagePal/CustomButton/view/adminhtml/layout/sales_order_view.xml**

    <?xml version="1.0"?>
    <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
        <body>
            <referenceBlock name="sales_order_edit">
                <block class="MagePal\CustomButton\Block\Adminhtml\Order\View\Buttons" name="custom_buttons" />
            </referenceBlock>
        </body>
    </page>


**MagePal/CustomButton/Block/Adminhtml/Order/View/Buttons.php**

    namespace MagePal\CustomButton\Block\Adminhtml\Order\View;
        
    class Buttons extends \Magento\Sales\Block\Adminhtml\Order\View
    {    

       protected function _construct()
        {
            parent::_construct();

            if(!$this->getOrderId()) {
                return $this;
            }

            $buttonUrl = $this->_urlBuilder->getUrl(
                'adminhtml/custombutton/new',
                ['order_id' => $this->getOrderId()]
            );

            $this->addButton(
                'create_custom_button',
                ['label' => __('Custom Button'), 'onclick' => 'setLocation(\'' . $buttonUrl . '\')']
            );
            
            return $this;
        }

    }