This is the exact tradeoff the Linux kernel scheduler and glibc's malloc arenas navigate constantly: futex-based mutexes are simpler and often faster under light load, while high-contention hot paths (like the kernel's per-CPU run queues) switch to lock-free or RCU techniques because blocking under contention creates convoying that a CAS retry loop avoids. Measuring your own crossover point here is the practical skill that keeps engineers from reaching for lock-free code where a plain mutex would have been faster and safer.