Faits: A. La SI X._ et C._ étaient propriétaires d'un immeuble édifié en 1971, à Chêne-Bougeries. Par contrat du 14 juillet 1997, ils ont remis à bail à D._ un appartement au septième étage de cet immeuble. Conclu pour une durée de cinq ans et demi échéant le 31 août 2002, le bail se renouvelait ensuite tacitement d'année en année, sauf résiliation en temps utile. Fixé initialement à 14 400 fr., le loyer annuel net était indexé à la variation de l'indice suisse des prix à la consommation. Il s'élevait à 15 012 fr. depuis le 1er septembre 2001. En mars 1999, la propriété de l'immeuble a été transférée à A._, B._ et C._. Par avis de majoration du 10 avril 2002, les bailleurs ont manifesté leur volonté de porter le loyer annuel, sans les charges, à 15 768 fr. dès le 1er septembre 2002, à 16 512 fr. dès le 1er septembre 2003 et à 17 268 fr. dès le 1er septembre 2004. Ils motivaient ces hausses par une adaptation partielle aux loyers usuels pratiqués dans le quartier. B. Par requête du 22 avril 2002, D._ a contesté les augmentations et sollicité une baisse de loyer à partir du 1er septembre 2002. La Commission de conciliation en matière de baux et loyers n'a pu concilier les parties. Les bailleurs n'ont pas déposé de requête en validation des hausses de loyer. En revanche, la locataire a saisi le Tribunal des baux et loyers du canton de Genève d'une requête en réduction de loyer. Elle a demandé préalablement que les bailleurs soient invités à produire toutes les pièces utiles permettant d'effectuer un calcul de rendement et conclu, à titre principal, à ce que le loyer annuel soit fixé à 12 000 fr. sans les charges. Ses conclusions subsidiaires tendaient à une réduction de loyer de 8,26% fondée sur la baisse du taux hypothécaire. Lors de l'audience de comparution des mandataires du 3 octobre 2002, le tribunal a ordonné une instruction écrite et fixé des délais. Dans leur réponse du 21 novembre 2002, les défendeurs ont conclu, principalement, à l'irrecevabilité de la demande et, subsidiairement, au déboutement de la demanderesse de toutes ses conclusions. Sur le fond, les bailleurs contestaient à la locataire le droit de se prévaloir d'un calcul de rendement; ils estimaient par ailleurs que la baisse du taux hypothécaire était compensée par l'augmentation des charges d'exploitation. Par ordonnance préparatoire du 19 décembre 2002, le tribunal a invité les défendeurs à produire les pièces nécessaires au calcul du rendement net de l'immeuble concerné. Dans leurs écritures du 6 février 2003, les bailleurs ont procédé à un calcul de rendement, tout en persistant à rejeter un tel mode de fixation du loyer; ils ont produit les pièces sollicitées dans l'ordonnance du 19 décembre 2002. Pour la première fois, ils ont fait allusion à la possibilité de «déterminer la valeur des immeubles anciens par référence aux prix du quartier»; aucune pièce permettant une comparaison des loyers n'a été versée au dossier. Par jugement du 12 juin 2003, le tribunal a fixé à 12 000 fr. le loyer annuel net à payer par la demanderesse dès le 1er septembre 2002. Il a jugé que la locataire était fondée à invoquer un facteur absolu à l'appui de sa demande de baisse, dans la mesure où le précédent loyer résultait d'un bail à loyers indexés. Il a ensuite procédé à un calcul de rendement, jugeant qu'un tel calcul ne pouvait être refusé à la demanderesse dès lors que les défendeurs n'avaient pas apporté la preuve des loyers usuels. Les bailleurs ont interjeté appel de ce jugement. Ils soutenaient en particulier que les premiers juges auraient dû appliquer la méthode relative ou, en tout cas, apprécier le loyer payé par la demanderesse à l'aune des loyers du quartier au lieu d'effectuer un calcul de rendement. Les défendeurs ont produit des pièces nouvelles, destinées à démontrer que le loyer litigieux se situait dans les limites des loyers usuels dans le quartier. Ils n'ont pas remis en cause, en tant que tel, le calcul de rendement effectué par le Tribunal des baux et loyers. Par arrêt du 30 avril 2004, la Chambre d'appel en matière de baux et loyers a confirmé le jugement de première instance. C. A._, B._ et C._ interjettent un recours en réforme. Ils demandent au Tribunal fédéral d'annuler l'arrêt de la Chambre d'appel et de débouter D._ de toutes ses conclusions ou, subsidiairement, de renvoyer la cause à la juridiction cantonale. D._ propose le rejet du recours. Par arrêt de ce jour, le Tribunal fédéral a rejeté le recours de droit public formé parallèlement par les bailleurs contre la décision de la Chambre d'appel.