В първия случай, продължението върви на същата нишка, на която се завършва задачата, заради TaskContinuationOptions.ExecuteSynchronously.
Във втория случай, то ще върви в оригиналния synchronization context(ако methodToExecute се извика на нишка със synchronization context)
Въпреки че първият подход може да е по-ефективен, той може и да е по-труден за разбиране.
Следвайки KISS принципа с малко изменение:
await methodToExecute().ConfigureAwait(false);
#1 изглежда рекурсивен по концепция, но дали ще е така при един stack-frame?
Дали ще се случи рекурсивно в stack-frame-а или асинхронно в друг stack-frame, зависи изцяло от това какво се случва в methodToExecute. В повечето случаи няма рекурсия ако използваш асинхронно апи в метода. Например HttpClient.GetStringAsync завършва на случайна IOCP нишка от thread pool-а.
Но, дори асинхронно апи може да завърши синхронно на същата нишка (MemoryStream.ReadAsync или Task.Delay(0)). В такъв случай има рекурсия.
Използването на TaskCompletionSource.SetResult в methodToExecute може да задейства синхронни операции.
Ако искаш да избегнеш възможността за рекурси, извиквай methodToExecute чрез Task.Run. Или още по-добре, премахни TaskContinuationOptions.ExecuteSynchronously.