С точки зрения разработки программного обеспечения вы правы, делегаты во многом похожи на интерфейсы функций в том смысле, что они создают прототип интерфейса функций.
Они также могут использоваться во многом аналогичным образом: вместо передачи целого класса, содержащего необходимый метод, вы можете передать только делегат. Это экономит много кода и создает намного более читаемый код.
Более того, с появлением лямбда-выражений их теперь можно легко определять на лету, что является огромным бонусом. Хотя ВОЗМОЖНО создавать классы на лету в C #, это действительно огромная боль в заднице.
Сравнение двух - интересная концепция. Ранее я не думал, насколько похожи идеи с точки зрения варианта использования и структурирования кода.