Full disclosure: I'm the CEO of Chesspark and a board and council member of the XSF (the standards organization behind XMPP).

I highly recommend XMPP. You get a lot of functionality for free: contact lists, presence, access to a huge and diverse library of implementations, and a large community of helpful people. It's also fairly easy to extend, and this can be done at many levels.

It's true that at Chesspark we've spent a lot of time working with XMPP and molding it to our particular task. Much of this is because we liked doing it, and you can see that passion revealed in our various open source projects related to XMPP. For us this has paid huge dividends as our new projects are more messaging than chess related.

Between Tigase, Openfire, and Ejabberd, there are a number of fairly robust server implementations that are easy to set up and easy to maintain. People think of ejabberd as a black box because they are afraid of Erlang, but the fact is that ejabberd code is pretty easy to read and modify. You also have Google Talk available via Google Apps for Domains.

On the Web interface side, things are not as easy, but the XMPP solutions are well tested and have been worked on for 3-4 years (XMPP BOSH predates Comet). I count at least 4 diferent JavaScript implementations you can choose from, one of which is commercial and comes with support. Three of the four (my own is the odd lib out here) include chat application features, not just base protocol support. I now of at least one AS3 implementation which should soon be open source (from Seesmic).

This is a classic build versus buy type of decision. Sure you can build this yourself, but is it really less work than a little learning of the XMPP protocol, perhaps a few bug fixes in an available library, and some custom component work? If we had done our own non-XMPP based server platform, we'd have spent more time solving similar problems but without any external help or tools.

One of the nice things for us at Chesspark is that many of the features we wanted to do had already been partial solved by XMPP extension protocols: group chat for watching live games, publish-subscribe for rating updates and profile notifications, and ad-hoc commands for generic RPC type functionality.

You mention that you'd need extensive modifications, and I can't really help much here without knowing what modifications you're thinking of. XMPP can be extended at many levels. At Chesspark we have XMPP bots that maintain order in the public chat rooms and our client implements the moderation facilities of the multi-user chat protocol. Community managers can privately warn, mute, kick, and ban people. The next step up are components, which can pretty much listen to anything going on in the server and react to it, or handle messages directly from users. These are extremely easy to write, and ejabberd comes full of hooks for you to attach to to implement most things you can imagine. Most of ejabberd's own modules are quite small and serve as good examples. One thing to note about components is that ejabberd supports the component protocol, so you can write these server extensions in the langauge of your choice. At Chesspark, most of our components are in Python, but they will run on ejabberd, jabberd2, Tigase, or almost any other XMPP server that exists. That is the power of the open standard. The last resort is to modify the server internals. We've had to do this at Chesspark a single time to add an API hook for disconnecting users from our ejabberd module.

I think you have little to lose by spending a few hours getting ejabberd or another server set up and seeing what tools and libraries already exist that might assist you in your goals.