Зачем использовать callback функцию(именно передавать ее в качестве аргумента),если можно просто вызвать функцию,которая видна например по замыканию?
Callback-функция может меняться от вызова к вызову основной функции.
Например, метод Array.prototype.sort(), в который передаётся функция, определяющая порядок сортировки. В зависимости от переданной callback-функции метод может сортировать как числа, так и строки или объекты, как в возрастающем или убывающем порядке, так и в более сложном, например по расстоянию от заданной точки.
Кстати, onload в вашем примере - это тоже callback-функция, только переданная как свойство, а не аргумент другой функции.
Затем, что, навскидку:

На момент написания кода функции first, функции second может не существовать
Внутри first может быть асинхронная операция
first может передать коллбэк далее вниз по цепочке или еще в какую другую функцию
