1. Degenerate cases with new allocator designs, e.g. being better for some workloads and not others
2. Bug-for-bug compatibility - applications which break due to dependencies on undocumented behavior or the old allocator memory structures.
3. Boundary conflicts - systems where an allocator change would mean allocation and free are hitting different implementations across module boundaries, as one module allocates memory for another to consume. Some systems and programming languages are more vulnerable to this sort of issue.
In any case, Apple and others have invested hugely in LLVM AddressSanitizer, so the Electric Fence-like malloc debugging features are considered more of a last resort these days.
[1]: http://jemalloc.net/jemalloc.3.html
[2]: https://chromium.googlesource.com/external/gperftools/+/gper...
GWP ASAN from TCMalloc might be the better direction for runtime support for memory corruption from malloc as it gives a lot of ASAN-like protection with an electric fence-like performance profile (& can be turned on/off at runtime).