Sì, così va bene.
Prima non funzionava perché la immagine originale era caricata in modo asincrono dal Toolkit di AWT (ImageIcon aggiunge di suo solo il tracking per attendere il completamento del caricamento). E la immagine scalata era di nuovo una immagine caricabile in modo asincrono, percui subito immediatamente dopo il getScaledInstance, il newImage.getWidth(null) ti restituisce -1 (idem per height) perché la dimensione non è ancora nota. E questo era il problema per la creazione del BufferedImage.
Se la immagine originale la carichi con la ImageIO, hai un BufferedImage già completa e la immagine scalata è presumibilmente di nuovo un BufferedImage, quindi completa (non ho mai verificato questo aspetto ma credo sia così).