UPDATE: I think esriRequest in 4.9 doesn't currently work for a geoprocessing service upload endpoint (it works in 3.x though). Adding query: {"f":"json"} to the esriRequest options appends the parameter to the url a la GET query parameters, even while it POSTs the form data (in my case the binary file). However, the geoprocessing service upload endpoint doesn't accept these GET parameters. So there are two ways to deal with it
1. Use responseType: xml in the esriRequest options and parse the resultant html page with regex.
2. I added <input type="hidden" name="f" value="json"/> to my form to shoehorn the parameter into the POST request
So my final form html looks like
<form enctype="multipart/form-data" method="post" id="uploadForm" ref="myelement">
<label>
<span class="btn btn-primary">
<span>Browse…</span>
<input type="file" name="file" id="file" accept=".kmz, .kml" @change="handleFile">
</span>
</label>
<input type="hidden" name="f" value="json"/>
</form>
and my final EsriRequest is
esriRequest("https://mygisserver/arcgis/rest/services/Geoprocessing/UploadKML/GPServer/uploads/upload",
{
body: dom.byId("uploadForm"),
responseType: 'json'
}).then(successHandler, errorHandler);
This was the ONLY way I could get the service to return JSON....
If anyone has solved this another way, please let me know, because it seems like a bug in the 4.x version of the API when communicating with this particular type of rest endpoint and uploading a file...