some of that code looks a little weird, you've got "runs a statement and returns one result", but it appears to return the whole result set from execute() - but then you call close() on it, which means you won't be able to get any rows from it. so I'm guessing that's not the actual code.
the specifics of how you deal with these result sets, which you're getting via a method SQLA calls "connectionless, implicit execution", would determine if connections are staying open too long or not. If you get a result from execute(), then fetch a few rows from it, then forget about it, the connection for that result is still checked out from the pool and reserved for that result for any amount of time, until the result object is garbage collected.
So you want to make sure the result objects get closed out in all cases, which usually means calling fetchall() on them or otherwise getting all results unconditionally.