Use a dI/dt snubber and filter.
The most commonly seen snubber is an R+C snubber, which helps with dV/dt, but more to the point, damping. An R+C is connected in parallel with the switch or load. An R||L is complementary to this -- and connected in series instead.
Fundamentally, a TRIAC is going from high resistance to low resistance within a microsecond or so. This is a very aggressive phenomenon. It's different from a signal generator delivering a high voltage step, because a signal generator has a constant source resistance; this doesn't. It also cannot be slowed down, or shrunk in size* -- your only option is filtering.
*You could hide the TRIAC behind a transformer and get a different V/I ratio, but the same V*I product must still be switched. Power conservation and all that.
So, you might add an LC lowpass filter to attenuate the switching edges. An LC filter has a characteristic impedance, but the TRIAC does not, and the load and mains probably don't have very consistent impedances either, so you must provide termination for the filter.
The most likely choice, then, is a constant-resistance filter: a conventional LC filter, with RC and RLC elements added to its input and output, to dampen the filter's response even when the input or output impedances are very mismatched.
There aren't many design tools around for these types of filters, but they are out there. It may help to know they are a special case of a more general type of filter: a diplexer. Specifically, one with the high-pass port terminated. Those may be more commonly seen, or easier to design. For example, an easy way to synthesize one, is to connect two Butterworth type filters together, one lowpass, one highpass, both of the one-port-open type (a filter needs at least one port terminated; the most commonly seen filter tables are for both ports terminated, though).
More likely -- since exact frequency response doesn't matter here -- you'll take an LCL filter, add R+C in parallel with, and L||R in series with, the input and output, and adjust values until the response (for one port shorted, and the same port open) is satisfactory.
Tim