.PHONY targets and multi-line Make rule bodies are a pet peeve of mine too. I'm not sure why people are so afraid to create extra scripts. When you're in the business of running processes, the programming language is shell and the unit of abstraction is a script file: You shouldn't be afraid to make a .sh file at nearly the level of granularity you'd make a top-level function in your general purpose environment.
I find that in recent versions of GNU make, the ONESHELL and define directives alleviate some of the pain of multi-line rules. There is also this emacs package [1] I wrote while maintaining an inline-shell heavy makefile framework that had to run on make 3.81 (the version that comes with CentOS 6).
I definitely agree with you on extracting rules into separate scripts, but I've yet to see a make-based build system that embraces this idea.
Because having one function per file is a huge hassle when editing them. I'm working on a system which is built out of >50 batch files in that manner; I had to write a tool to show me the callgraph in order to properly understand it.