A heat sink is probably the simplest solution but there are other methods. If you use relays you will waste power in the relay coil and they tend to be physically big. Consider that a relay and heat sink would probably be about the same size but the relay less efficient.
The underlying problem is the voltage drop across the transistor. The power it dissipates is the Collector to Emitter voltage multiplied by the Emitter current. There isn't much you can do about the current because your lamp needs it to function so the only realistic way to reduce the heat is to drop less voltage across the transistor.
There are many solutions but these are probably simplest:
1. Instead of using a darlington transistor, use a normal small power transistor and connect a second transistor to boost the base current. Connect the 2.2K to the base of the new transistor, connect its emitter to the base of the power transistor. The collector goes to the 24V supply through a resistor. Choose the resistor value so it lets enough current flow to saturate the power transistor. Something in the region of 680 to 820 Ohms will probably do. This method only adds two components, the new transistor and it's collector resistor.
2. Use a power MOSFET instead of the BD681. These devices will drop much lower voltages, typically less than 0.2V per Amp. The drawback is that you may need more voltage than the PIC can supply to turn it fully on. Look for "logic level" MOSFETS, you should be able to find something suitable, otherwise you need a second transistor again to act as a gate voltage booster.
Sorry I can't draw diagrams at the moment, due to family problems I am not at my usual PC until next week.
Brian.