tl;dr: It looks like designs which route ordinary literals through StringInterpolationProtocol can significantly compromise the performance of non-interpolated string literals.
So, I threw together an alternative design. This probably would change if developed further—in fact, I think ExpressibleByStringInterpolation might be eliminated entirely, and a lot of names would shift around—but I think the prototype is the right "shape" to draw some conclusions.
The essential difference in this design is that, instead of having separate StringLiteralType/init(stringLiteral:) and StringInterpolation/init(stringInterpolation:) associated types/initializers, the StringLiteralType of an interpolation-supporting type conforms to StringInterpolationProtocol. In theory this means that all literal uses on a conforming type, even ones with no interpolation, are handled through StringInterpolationProtocol; for instance, initializing a String would always involve a DefaultStringInterpolation instance. In practice, though, Swift sidesteps this for String by using the builtin protocols.
In the prototype, conditional conformance's rules limit this design somewhat. In order to be allowed as a StringLiteralType, StringInterpolationProtocol conforms to _ExpressibleByBuiltinStringLiteral. We would want it to conditionally conform to _ExpressibleByBuiltinUTF16StringLiteral too, but you can't make a protocol conditionally conform. A deeper redesign might be able to address this issue by reshuffling some of the protocols around.
I benchmarked this alternative to compare it with the proposal's design (results: proposal, alternative). The results were pretty meh; the alternative was generally slightly worse, but optimization work might close that gap.
However, our benchmarks all use String, and String probably bypasses the slower parts of this alternative, so I also wrote two new benchmarks. Both of them operate on a simple type which uses DefaultStringInterpolation:
struct CustomString: ExpressibleByStringInterpolation {
var value: String
// Initializer is slightly different in the alternative design.
init(stringLiteral: String) {
self.value = stringLiteral
}
}
The first one is basically just the StringInterpolation benchmark, but constructing a CustomString instead of a String. The results are as muddled as the interpolation benchmarks on normal Strings:

But the other new benchmark is a different story. This one has no interpolations at all—that is, it's a benchmark of custom types expressed as non-interpolated string literals. And there we see a pretty heavy penalty for the alternative design:

So routing ordinary literals through the interpolation machinery seems to be a bad idea; designs that do this might have elegant properties, but they may also have a significant performance penalty for non-interpolated string literals.
I suspect this lesson would also apply to making init(stringLiteral:) forward to init(stringInterpolation:), but I can test that if you'd like.