Quick but possibly incorrect response since I havn't the time just now to try to dig deeply into code written nearly 10 years ago. Will dig when I can, maybe next weekend.
I am not sure that the whole priority thing is extant in one piece of code and the sections of the menu select between filetype specific and filetype independent commands so they don't need priority selection (except for execute which is where GEANY_BCS_PROJ_FT is used).
"in reality there are only three sources, system, user and project settings"
Because as above, the menu distinguishes between them (except for execute).
With #2307, I think GEANY_BCS_PROJ_FT can be removed
So given above, conceptually yes might be able to, have to look at the detail of #2307 yet though. And note its in the plugin API so a period of deprecation might be appropriate.
Some of the messiness of the build stuff is trying to map the more general configuration system into the original menu system so it was retained. Adding an extra section as per #2307 will hopefully make it simpler and allow some cleanup.
Also in get_next_build_cmd: for the filetype build group, GEANY_BCS_PREF is used for ft->priv->homefilecmds. Shouldn't that correspond to GEANY_BCS_HOME_FT, as it does in get_build_group_pointer?
Depends what the caller provides, maybe we just left some existing code passing the same GEANY_BCS_PREF as it did before.
Another difference: for (filetype) execute, get_next_build_cmd uses GEANY_BCS_FT for `ft->priv->homeexeccmds, but in get_build_group_pointer, GEANY_BCS_HOME_FT is used, which seems the correct source.
Also (without having time to check in detail) be careful that project stuff both filetype and non-filetype commands load from the one file but for other sources the filetype and non-filetype loads from differing files, but both are distributed across the filetype files data structures. So it may depend on if the particular function is accessing the file locations or the in memory data structures.