Если вы реализуете контракты обратного вызова, тогда вы устраняете необходимость для клиента реализовывать многопоточный код. Это может не быть существенным преимуществом при работе с клиентами .Net (поскольку VS автоматически генерирует асинхронный прокси-код для вас), хотя может оказаться полезным при работе с клиентами других платформ / языков.
Какой из них чище? Ну, это зависит от того, являетесь ли вы разработчиком клиента или сервера. Если, как я подозреваю в вашем случае, вы оба, и вы можете просто использовать .Net для клиента и сервера, то я бы, вероятно, соблазнился пока избегать обратных вызовов. Если бы вы подразумевали, что служба звонит, где требуется 45 секунд, то я бы сказала, что отозваны контракты, это действительно субъективно, но если бы мне пришлось высовываться, то я бы сказала, что если ответы займут больше 5 секунд тогда пришло время перейти к обратным вызовам.