Consiglio di:
1) Trasformare il VARCHAR in un INT UNSIGNED, molto più piccolo e quindi più veloce. Se il motivo è che vuoi avere gli zeri a sinistra, puoi usare l'attributo ZEROFILL. Poi togli il *1 e il CAST().
2) Consiglio che codice sia chiave primaria e di creare un indice su figlio (che implicitamente diventerebbe figlio + codice).
3) Fare come altri ti hanno suggerito: fai una tabella di numeri da 1 a X e fai una JOIN tra quella tabella e articoli. Seleziona i numeri dalla tab ausiliaria ON numeri.codice = articoli.codice WHERE articoli.codice IS NULL AND articoli.figlio = 0.
La UNION forse è meglio lasciarla (in teoria potresti semplicemente aggiungere una OR, ma non sono sicuro sul query plan).