Fala Gabriel, tudo certo?
Testei a sua função anosGeracoes separadamente e ela retornava tudo certo, sem undefined.
Para isto coloquei um console.log(i, anos, geracoes); dentro da função e acompanhei a impressão das variáveis no loop. Eram 18, calculando os anos perfeitamente e sem o undefined no final.
Percebi então que você chamou essa função dentro de outra texto(anosGeracoes());.. foi aí que o script se perdeu um pouco e confesso que não sei te explicar a função o que ocorreu porém, se você observar as funções estão disparando dois document.write (um no texto() e outra no anosGeracoes().
O que pode ser feito ai?
Você precisará mudar:
DE: texto(anosGeracoes());
PARA: anosGeracoes();
Só com isso o código irá parar de retornar undefined no final e os anos serão impressos na mesma linha.
Se você quiser quiser que os anos sejam impressos um embaixo do outro é só mudar:
DE: document.write(anos + "; ");
PARA: texto(anos + "; ");
Essa alteração é feita dentro da função anosGeracoes()
Espero ter ajudado!