Faits: A. Depuis 1974, H.Y._ est locataire d'un appartement sis au chemin de Roches ..., à Genève, près de la limite des quartiers des Eaux-Vives et de Champel; F.Y._ est devenue ultérieurement colocataire. X._ SA est propriétaire de l'immeuble. Depuis le 1er juillet 2001, le loyer, charges non comprises, s'élève à 7'824 fr. par an, soit 652 fr. par mois. Comprenant quatre pièces et occupant 83 m2, l'appartement est situé au premier étage de l'immeuble, construit en 1935; il comprend un hall d'entrée, des fenêtres à vitrage simple, une cuisine agencée mais pas équipée et des dépendances; il ne bénéficie pas d'une place de parc. Le bâtiment, dont l'état général est qualifié de moyen, est équipé du chauffage central, d'un ascenseur et du téléréseau collectif. Il est situé sur le carrefour où convergent et se croisent la rue de la Terrassière - sur laquelle circule le tram -, la rue du 31-Décembre, l'avenue Théodore-Weber et le chemin de Roches; les nuisances sonores sont importantes. Il y a des commerces, des restaurants, des transports publics, des écoles et des jardins publics à proximité. Par avis officiel du 6 juin 2007, X._ SA a résilié le bail pour le 30 septembre 2007. Le congé a été signifié pour des motifs économiques, afin de relouer l'appartement à un tiers pour un loyer supérieur. B. H. Y._ et F.Y._ ont saisi la Commission de conciliation d'une requête en annulation de congé. Non conciliée, l'affaire a été portée devant le Tribunal des baux et loyers du canton de Genève. En cours de procédure, la bailleresse a produit les fiches comparatives de trente-sept appartements. Par jugement du 20 novembre 2008, le tribunal a annulé le congé. Il a retenu qu'aucun des exemples fournis par la bailleresse n'était comparable à l'appartement en cause, pour des motifs divers tels que des différences de surface, d'état d'entretien, d'année de construction ou d'équipement. Comme la bailleresse n'avait pas été en mesure de produire les cinq exemples comparatifs exigés par la jurisprudence, elle n'avait pas démontré que le loyer payé par les locataires était inférieur aux loyers usuels du quartier et qu'elle pouvait ainsi obtenir un loyer plus élevé non abusif d'un nouveau locataire. Le tribunal a donc admis que le congé notifié le 6 juin 2007 contrevenait à la bonne foi. Saisie par la bailleresse, la Chambre d'appel en matière de baux et loyers du canton de Genève a confirmé le jugement de première instance dans un arrêt du 19 juin 2009, avec une motivation partiellement différente. En effet, elle a d'emblée écarté de la comparaison les objets qui étaient situés en dehors d'un périmètre délimité par la rue Mussard, la route de Malagnou, la rue de Villereuse, la rue de Jargonnant et le début de la route de Frontenex jusqu'à la rue Viollier. Selon la cour cantonale, les appartements sis hors de ce périmètre se trouvent dans des tissus urbains différents: le quartier des Eaux-Vives, compris entre la route de Frontenex et le quai Gustave-Ador, est composé d'immeubles du dix-neuvième siècle inscrits dans un urbanisme de la même époque; le quartier de Champel, allant de la route de Malagnou au chemin des Crêts-de-Champel, a un caractère résidentiel plus marqué et subit moins de nuisances sonores; les autres exemples se trouvent à une distance trop grande pour permettre une comparaison raisonnable. En conséquence, la Chambre d'appel a examiné uniquement les sept objets présentés par la bailleresse se situant dans le périmètre précité. Pour des motifs divers, elle est arrivée à la conclusion qu'aucun de ces éléments ne pouvait être comparé avec l'appartement dont le bail a été résilié. C. X._ SA interjette un recours en matière civile. Elle conclut principalement à ce qu'il soit constaté que le bail a été valablement résilié avec effet au 30 septembre 2007 et à ce qu'aucune prolongation de bail ne soit accordée aux locataires; à titre subsidiaire, elle demande le renvoi de la cause à la cour cantonale. H. Y._ et F.Y._ proposent le rejet du recours. La cour de céans a délibéré sur le recours en séance publique. 