The log-spam is a known quirk, but can easily mask the actual issue at play.
As a debugging step, I’d be tempted to disable the sensor so you can see if there are any other issues happening.
matrix_keypad:
  id: keypad
  keys: ABCDEFGHIJKLMNOPQRSTUVWX
  rows:
    - pin:
        number: GPIO21
#        allow_other_uses: true
    - pin:
        number: GPIO20
#        allow_other_uses: true
    - pin:
        number: GPIO3
#        allow_other_uses: true
    - pin:
        number: GPIO7
#        allow_other_uses: true
  columns:
    - pin:
        number: GPIO0
        drive_strength: 5mA
    - pin:
        number: GPIO1
        drive_strength: 5mA
    - pin:
        number: GPIO10
        drive_strength: 5mA
    - pin:
        number: GPIO4
        drive_strength: 5mA
    - pin:
        number: GPIO5
        drive_strength: 5mA
    - pin:
        number: GPIO6
        drive_strength: 5mA
binary_sensor:
#  - platform: gpio
#    id: keypad_row_21
#    pin:
#      number: GPIO21
#      allow_other_uses: true
#  - platform: gpio
#    id: keypad_row_20
#    pin:
#      number: GPIO20
#      allow_other_uses: true
#  - platform: gpio
#    id: keypad_row_03
#    pin:
#      number: GPIO3
#      allow_other_uses: true
#  - platform: gpio
#    id: keypad_row_07
#    pin:
#      number: GPIO7
#      allow_other_uses: true
Given I can see the Connected Successfully line, I’m shocked that it’s not showing in Connected in HomeAssistant.
Nb: We’ve issued a PR here, which should fix the log spam
https://github.com/esphome/esphome/pull/7163