To further the conversation, another approach of course is single table inheritance. This means that my data structure would involve putting all attributes on a single users table, with a large number of them being null depending on the user type. I could then override the Eloquent model newFromBuilder method to use a factory to return a specific model for the user type based on a user_type field on the users table. Of course, a table with dozens of null fields is what I was trying to avoid, though this solution does seem cleaner.
A somewhat hybrid approach is presented here: https://github.com/ThibaudDauce/EloquentInheritanceStorage. Essentially, a single table inheritance methodology is used. However, instead of creating one big master table with nullable fields, you instead create multiple "inherited" tables, as I have started to do, then use a database view to bring them together into the single master table. While this seems to abstract away my main aversion to the STI pattern, there are some drawbacks to using views that I'd like to avoid.
What I'd like is a way to use an inheritance pattern at the database level, but use a single (type-specific) model which handles working with the two underlying tables as if they were just one. Is this even a good idea? Anyone have experience in doing this?