I came across this in late 2007, and forgot to blog about it. Just catching up, and wanting to post it for reference.
While working with page layouts in MOSS, a few of use sometimes encountered a strange message when we requested the page:
Only Content controls are allowed directly in a content page that contains Content controls.
We'd verify that there wasn't anything in our page layout(s) or master page what was not consistent with ASP.NET syntax. Sure enough, everything in the page layout was sitting (properly) inside an ASP Content server control.
Rather than repeating all the things we looked at to try to resolve the issue, I point you to Rich Finn's article, which ultimately helped me figure out what was going on (see his update at the end of the post).
In a nutshell, ensure your page layout markup uses this casing for all Content web server controls:
<asp:Content . ></asp:Content>
and NOT this:
<asp:content . ></asp:content>
Note the capital "Content" v. the lower case "content" in the second instance. That one issue caused SharePoint to freak out.
I haven't fully confirmed whether or not the last set of asp:Content controls was the issue, or if it was an inconsistency with the opening/closing tags. Nor have I found out what it was that made the controls lower case (could be Visual Studio copy/paste settings), but to be safe, just make sure it's all capitalized and you won't encounter the grief that I did.
There is one other post out there by Waldek Mastykarz which mentions an issue with the PlaceHolderPageTitle placeholder. I haven't confirmed that the PlaceHolderPageTitle is in fact the root of all evil, but he seems to indicate a similar symptom if you don't include it in your page layout. In my tests, I did NOT have the PlaceHolderPageTitle, and my page layout still worked correctly after I fixed the case issue for the Content web server control.
I hope this helps you.
Final Note: I encountered this problem in November 2007; I do not remember whether or not I had SP1 installed at the time. If I have a chance to test this again, I will update this post.
[Update: December 2008]
It's been a while since I've had to do any custom SharePoint dev, but I sure am glad I was able to spot the error when I saw the "parser error" message again (when ASP.NET error messages are enabled).
First update: I can confirm that the issue still exists in SP1.
Second update: as I suspected back then, it's the very last Content control that causes the error. So make sure at least the last Content control is properly cased.