Tilemap is great when you’re rendering lots of things that don’t need fancy unique data or logic per instance.
GameObjects are great when you want individualized behavior (e.g. components) for your objects or objects that individually move. They have more overhead (the g.o., the transform, your components) than Tilemap tiles, but are more versatile.
A mix is often a good strategy. For example, if you imagine a world with trees in the foreground and grass/dirt in the background, the trees may be more appropriate as gameobjects, whereas the grass/dirt could be represented as tiles.
For your particular case, 100 cards isn’t very much so performance is less of a concern. Moreover, since the player could click and drag a card to move, that suggests that GameObjects might be more intuitive. A card is locked into a slot but then when clicked follows the mouse. If you were to accomplish the same with tilemaps, that might be a bit more complicated: spawning a GameObject to represent the card while it is dragged through the air. Finally, it may be useful to encapsulate different behaviors of your card types into components.
Overall, I think it would be wise to start with GameObjects and components.
In either case, you’ll need some data structure that represents the grid with all the slots that cards can go. Without knowing the rules of your game, it is difficult to speculate how this might work. I imagine one strategy is to keep a Dictionary<Vector2Int, List> which represents the cards stacked on top of one another in each slot, and on clicking you check the topmost card in that list.
It still may be helpful to borrow part of the Tilemap, though… the Grid. The grid provides a few nice methods to translate between gridspace - the slot/cell for each card - and worldspace. Methods like grid.WorldToCell and grid.CellToWorld may be useful. If you have the position of a card in the world, you can ask the grid to translate that world position to the correct Vector2Int slot. When placing a card, you translate from its worldspace to register it to the Vector2Int slot.