I would say the following two code snippets I have are equivalent, but they aren't.
The following is working correctly:
var entry3 = Task.Run(async () => await entry2.GetMemberGroupsAsync(false)).WaitForResult().FirstOrDefault();
The following code, where I just moved the Task.Run.WaitForResult chain into an extension method, isn't working, but produces a deadlock:
var entry3 = entry2.GetMemberGroupsAsync(false).RunSynchronouslyAndReturnResult().FirstOrDefault();
public static T RunSynchronouslyAndReturnResult<T>(this Task<T> task)
{
    return Task.Run(async () => await task).WaitForResult();
}
Why aren't these two code snippets equivalent?
For completeness's sake, the GetMemberGroupsAsync method is provided by Microsoft Azure Graph API, and the function WaitForResult is defined below. As far as I can see, it doesn't do anything different depending on the caller name or sth. like that:
public static TResult WaitForResult<TResult>(this Task<TResult> task,
                                             bool continueOnCapturedContext = false)
{
    if (task == null)
    {
        throw new ArgumentNullException("task");
    }
    try
    {
        return PreventForDeadLocks(task, continueOnCapturedContext).Result;
    }
    catch (AggregateException ex)
    {
        if (ex.InnerExceptions.Count == 1)
        {
            throw ex.InnerExceptions[0];
        }
        throw;
    }
}
public static async Task<TResult> PreventForDeadLocks<TResult>(this Task<TResult> task,
                                                               bool continueOnCapturedContext = false)
{
    return await task.ConfigureAwait(continueOnCapturedContext: continueOnCapturedContext);
}