This is one of the best solutions I have seen so far without using plugins

MagePal/CustomButton/view/adminhtml/layout/adminhtml_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">
                    <action method="addButtons"/>
                </block>
            </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
    {    
        public function __construct(
            \Magento\Backend\Block\Widget\Context $context,
            \Magento\Framework\Registry $registry,
            \Magento\Sales\Model\Config $salesConfig,
            \Magento\Sales\Helper\Reorder $reorderHelper,
            array $data = []
        ) {
            parent::__construct($context, $registry, $salesConfig, $reorderHelper, $data);
        }
    
        public function addButtons()
        {
            $parentBlock = $this->getParentBlock();
    
            if(!$parentBlock instanceof \Magento\Backend\Block\Template || !$parentBlock->getOrderId()) {
                return;
            }

            $buttonUrl = $this->_urlBuilder->getUrl(
                'adminhtml/custombutton/new',
                ['order_id' => $parentBlock->getOrderId()]
            );
    
            $this->getToolbar()->addChild(
                  'create_custom_button',
                  \Magento\Backend\Block\Widget\Button::class,
                  ['label' => __('Custom Button'), 'onclick' => 'setLocation(\'' . $buttonUrl . '\')']
                );
            }
            return $this;
        }
    
    }