Я склонен использовать синхронизированные методы, когда это общедоступный интерфейс, который требует синхронизации (например, синхронизированные коллекции) и синхронизированных блоков для внутренней синхронизации класса, такой как доступ к общему ресурсу, который должен быть безопасным для потоков.
Существует также проблема читабельности. Я считаю синхронизацию на уровне методов более точной и очевидной, поскольку код не загроможден управлением блокировками.
Что касается производительности, я не знаю каких-либо особых различий в поведении обоих подходов. Я думаю, что более важно избежать чрезмерной синхронизации, поэтому метод, которому нужен только доступ к общему ресурсу 1 из 10 вызовов, должен использовать уровень блока, а не синхронизацию на уровне метода.
Мой подход к любому сценарию обычно основан на сочетании этих факторов, измененных предыдущим опытом.