MySQL Best approach for recording last update timestamp for every column and every row
COMMENTARY
I love this question because I answered another question like it 7 years ago

June 30, 2013 : Get the Time of Last update of a column

You actually wrote the SQL I had suggested. I am impressed.
YOUR ACTUAL QUESTION
IMHO I would go with Suggestion #3 because its implementation is as normalized as you are going to get. The retrieval of the deltas for any column would consume the least amount of memory in the InnoDB Buffer Pool, memory within the DB Connection, and the smallest footprint on disk.
The other suggestions would have so much redundant data that retrieving the delta info would most likely push your working dataset out of the InnoDB Buffer Pool frequently.
CAPTAIN'S LOG : SUPPLEMENTAL
Surprisingly, there is an alternative.
MariaDB has implemented all the above suggestions into a table metadata framework called a Temporal Table. What you are going to implement falls under the category &quot;System-Versioned&quot;, which tracks the Change History of all table rows. The best part about &quot;System-Versioned Temporal Tables&quot; is that you do not need to explicitly create and track timestamps. That's done for you.
The only drawbacks I can think of are the following:

Small Learning Curve in Understanding MariaDB's SQL Dialect for Temporal Tables.
The timestamps are for the row not the column. This means a column may change or not from one iteration of a row's point-in-time to the next. You may need write some fancy SQL GROUP BY or DISTINCT aggregation to go through each row and stare at the column you wish to track or audit.