Sachverhalt: A. Am 9. November 2007 ersuchte die Firma Z._ um die Bewilligung einer Arealüberbauung mit Alters- und Familienwohnungen auf dem Grundstück Kat.-Nr. 11079 an der Gerenstrasse in Stäfa. Das Vorhaben umfasst zwei Baukörper ("Haupthaus" und "Haus West"). Das Grundstück liegt in der an die Kernzone angrenzenden dichten Wohnzone WD*. Am 11. März 2008 erteilte der Gemeinderat Stäfa die Bewilligung. Dagegen erhoben A. und B.X._ einerseits und eine weitere Partei anderseits je Rekurs bei der Baurekurskommission II des Kantons Zürich. Diese führte am 2. September 2008 einen Augenschein durch. Mit Entscheid vom 21. Oktober 2008 vereinigte sie die Rekursverfahren. In teilweiser Gutheissung der Rekurse ergänzte sie den Beschluss des Gemeinderates vom 11. März 2008 um eine Auflage bezüglich der Pergolen und des Laubengangs beim Haupthaus. Im Übrigen wies sie die Rekurse ab. Die von A. und B.X._ dagegen erhobene Beschwerde wies das Verwaltungsgericht des Kantons Zürich am 23. April 2009 ab. B. A. und B.X._ führen mit Eingabe vom 10. Juni 2009 Beschwerde beim Bundesgericht mit dem Antrag, der Entscheid des Verwaltungsgerichts sei, soweit er das Baugesuch schütze, aufzuheben und die Baubewilligung nicht zu erteilen. C. Das Verwaltungsgericht beantragt unter Hinweis auf die Erwägungen seines Entscheids die Abweisung der Beschwerde. Die Gemeinde und die Firma Z._ haben je eine Vernehmlassung eingereicht mit dem Antrag, die Beschwerde abzuweisen (soweit darauf einzutreten sei). A. und B.X._ haben innert mehrmals erstreckter Frist zu den Vernehmlassungen Stellung genommen. D. Mit Verfügung vom 17. Juli 2009 hat das präsidierende Mitglied der I. öffentlich-rechtlichen Abteilung das Gesuch um Gewährung der aufschiebenden Wirkung abgewiesen.