I have a map storage, which stores structures. I've just removed a field from the structure, should I write storage migration codes for that? Could substrate work with existing values without a migration?
Yes, you should.
The key thing to know is that you already have some encoded bytes of your struct in storage, and whenever a storage read operation is done on your map, the pallet needs to know how to decode the stored bytes back into a struct properly.
If you do not create a migration for your storage, then what would happen is that your storage read operations will fail, because the codec finds out that the encoded bytes do not decode back to your expected struct type.