Finally got it working, here's how I did it, the IP addresses used are fictitious and you should use your own.
In Zimbra get postfix using port 26, master.cf changes;
192.168.1.1:26 inet n - n - - smtpd
127.0.0.1:26 inet n - n - - smtpd
In the admin console choose Servers/your server/MTA and set the Web mail MTA hostname and Relay MTA for external delivery to 192.168.1.1 . The port stays at 25. I also had the same set under Global Settings just in case.
I'm assuming you already have a working Exim config, I'm using 4.66 but it should work with most recent versions. To make it work with Zimbra I added one router and one transport. Make sure your router is high enough in the list so that local mail is delivered to Zimbra first.
driver = manualroute
domains = your.domain.com
route_list = * 192.168.1.1
transport = zimbra_trans
self = send
driver = smtp
port = 26
That's it. Mail coming in the normal way gets picked up my exim and sent out to port 26 where postfix is waiting and delivers it to Zimbra. Sending mail from Zimbra goes directly to Exim, local mail gets routed back into Postfix for local deliver and mail destined for outside gets delivered by Exim without postfix ever having to look at it.
Hope this helps the Exim lovers out there!