An ejector, such as a venturi, facilitates the delivery of gaseous fuel to the combustion chamber of a burner. A blower forces air through the ejector, and the air flow produces a suction that draws fuel from a fuel inlet to produce a fuel-air mixture. The amount of fuel drawn from the fuel inlet is a function of the air flow such that a substantially constant fuel-air ratio is obtained over a range of air flow rates and temperatures without the need for a separate high-pressure fuel pump. The fuel-air mixture may be provided to a combustion chamber for combustion. Air from the blower may be pre-heated prior to entering the ejector, for example, using a heat exchanger that recovers some of the heat from the combusted fuel-air mixture. Air flow through the ejector may be conditioned, for example, by a swirler, to produce a tangential air flow that can increase fuel flow by increasing air velocity across the fuel inlet and / or produce a swirl-stabilized flame in the combustion chamber. The combusted fuel-air mixture may be provided to a thermal load, such as an external combustion engine. Blower speed may be controlled manually or automatically to control power output. Fuel flow to the ejector can be controlled manually or automatically to control fuel-air ratio. The burner can be configured to operate with multiple fuel types, for example, using a fuel selector with fixed or variable restrictors.