Основное отличие по сравнению с PROCEDURE в КП - это возможность указать не только на процедуру, но и на метод конкретного объекта.

Т.е. если есть VAR do: DELEGATE (a, b, c: INTEGER); obj: SomeObject,
и у типа SomeObject есть связанная процедура (obj: SomeObject) Do (a, b, c: INTEGER),
то мы можем:

do := obj.Do;
...
а потом косвенно вызвать метод Do объекта obj:
do(a, b, c).

Делегат хранит пару (объект, указатель на процедуру), где объект в частном случае может быть не определён (для простых процедур).

Моё мнение:
1) Концептуально штука простая и естественная. Если есть указатель на процедуру, то какая разница, кто обработает вызов - модуль или объект. На это всегда народ в спорах и упирает.
2) В реализации есть некоторые нюансы, но не особенные...
3) По значению своему не столь важно, чтобы разводить из мухи слона (как некоторые делали), но при массовых нововведениях в язык, когда-нибудь (например, при добавлении ЦД), я бы ввёл. Синтаксически просто сделал бы для всех PROCEDURE-переменных возможность указывать как на процедуры, так и на объект.метод. Похерив системную совместимость, пусть для системных указателей на процедуры на других языках будет флаг в SYSTEM.

===

Есть ещё отдельный нюанс - почему Оминк пометили процедурные переменные как устаревшие. Явно погорячились. Во-первых, без дальнейшей переделки языка всё равно от них не отказаться (конечно, они что-то планировали) - даже чтоб в итоге обратиться через Meta, нужно хотя бы временно получить проц. пер-ю. Во-вторых, лучше, видимо, сделать их более безопасными и общими (как-то решить проблему невалидности после выгрузки-перезагрузки модуля), плюнув на системную совместимость, как я написал выше.