It turns out to be quite a simple matter to insert a custom button into the DOM, and style it to match the other widgets. I used jQuery but standard JavaScript may also work:
var btnHtml = '<div class="esri-component esri-widget">';
btnHtml += '<div id="btnCustom" class="esri-widget--button esri-widget esri-interactive" role="button" title="My Custom Button">';
btnHtml += '<span aria-hidden="true" role="presentation" class="esri-icon esri-icon-map-pin"></span>';
btnHtml += '<span class="esri-icon-font-fallback-text">Custom Button</span></div></div>';
$(".esri-ui-top-left").append(btnHtml);
$("#btnCustom").click(function(){
alert("Clicked the custom button");
})
In this example the button is appended to the esri-ui-top-left
section, which adds it below the existing zoom widget.
See the live demo at https://codepen.io/slead/pen/zyjOpm