hey Michael -
What looks to be happening there is you're making an INSERT against the Table object for Event, the columns in this Table object are: "id", "start_date". The Table has no information about "start_time" as that is an ORM construct only. so your first example is equivalent towards:
table = Table("event", meta, Column("id", BigInteger), Column("start_date", DateTime))
stmt = table.insert().values(start_time=utcnow())
see the problem?
your second example which provides the actual "Event.start_time" attribute as a key allows SQLAlchemy to resolve that attribute into the Column it refers towards which is the Event.__table__.c.start_date column object.
Ideally if the insert() were against the Event ORM entity directly, the ORM would be smart enough to figure this out as in SQLAlchemy 1.4 we have ORM-enabled Core constructs, but currently insert() is the one that is not implemented right now. so maybe someday!