The resulting compiler command correctly uses arm-none-eabi-gcc but I find that the linker command also uses arm-none-eabi-gcc whereas I need it to call arm-none-eabi-ld.
Well, typically you just don’t and gcc will forward everything just right to the ld.
If you really have to, I think you must adjust CMAKE_LINKER and CMAKE_CXX_LINK_EXECUTABLE as described here: gcc - CMake: use a custom linker - Stack Overflow
CMake uses the compiler to drive the linker since it adds things like the standard library and other such things on its own. If CMake always used the linker, it would have to reverse engineer whatever flags get passed through the compiler driver.
Does using the compiler work? If so, just go with it. CMake does not offer fine-grained control over the linker because it is not well-abstracted at CMake level (between languages or generators).