Retweets are a table, replies and quotes are columns
A reply and a quote both carry text, so they need everything a tweet has — media, hashtags, their own replies. Making them tweets with a pointer costs one nullable column each. A plain retweet carries nothing; making it a tweet would mean a row with null content that every timeline query has to special-case, and un-retweeting would be a delete of something that looked like a post. As a separate table it is an insert and a delete, like a like.