When should I use one of them?
Or a little biased:
Why/When should I use execute_process() over add_custom_command()?
The difference between those two is, that execute_process() works at configure time (therefore will be executed with every cmake configure) and add_custom_command() works at build time (and is only executed when the dependencies change)
I only need add_custom_command(), but beginners tend to use execute_process() since it is easier to understand (and easier to find via doc/google), but dependencies are usually omitted.