There's some really cool work with running evolution-type algorithms versus gradient descent showing that training a network through gradient descent creates a training 'trajectory' (how it changes over time during the training process, in a very high dimensional space) that is basically the 'average' central tendency trajectory in the middle of the 'cloud' of trajectories that individual replicates of an evolutionary processes create. Of course, something like code is discrete chunks rather than real numbers you can calculate a gradient of, and kind of necessitates such an evolutionary process.
Sorry if I just get super nerdy technical here, I am in the middle of a project at work about the relationship between evolutionary processes and machine learning processes that's resulting in a lot of very interesting math about the nature of both and the kinds of things that they can learn.