Esistono in VB.NET per un discorso di retrocompatibilità con VB6.
Sul perché esistano in VB6 penso sia semplicemente sintassi(vedi pascal), secondo me è più corretto dividere sub e function rispetto ad utilizzare void.
Sul discorso se utilizzarle, SI, devi usarle, se è una procedura devi usare sub, scrivere finte function renderebbe il codice illeggibile.