I was stuck into this MPLS scenario for about 4 days. Really. That's an eternity...
It turns out a router on the middle of the path was blocking TCP 646. TCP 646 is LDP port for label exchange. It's the port used to exchange labels between peers. If peers can't exchange labels, it doesn't matter of course, if they are neighbors.
I had seen the output of the show ip cef for that vrf, but that didn't help me much, because I had no idea there was an ACL blocking LDP in the middle and I had no idea that this was causing the issue. That was nasty (for me at least).
Lesson of the day is - your routing protocol runs on top of IP to exchange data? Then pay attention to the chit-chat, gods above and below. Had I seen this 4 days ago my weekend would have been happier.
Worst of all, I rewatched all MPLS videos and still couldn't get it. It was only when I found a similar discussion and analysed it that I got it working. Because I found an ACL in the path, took it off, put it back on and logged the drops. Horrible reverse engineering, I should be better than that.
Anyway, moving on.