Thanks @Ryan Chynoweth.
>> Are you sure it is slow due to photon?
Yup. It's not falling back to Spark, per the execution plan. In fact, removing Photon from the cluster (for testing purposes) speeds up this particular operation by about 2x. So Photon supports what I'm doing, but it's not as efficient at it as good ol' Spark. Moral of the story: Photon is good for some things, and potentially bad for others.