In the opening scene, we see an empty bar out in the middle of the desert. The bartender, Jim Doherty (Gary Oldman) starts narrating in voice over as he cleans up and looks through a photo album:
"You ever seen a ghost? There's this guy. Comes in here. Every May 1st. Every May 1st, every December 1st. Like clock work. What's he want? Well, frankly, I ain't exactly sure. He had the strangest story to tell. He left this here and I keep it for him. How do I know he'll be back? What's that? A woman was involved? [trying on a ring] Hm, just fits. I was married once myself. Beautiful girl. By the way my name is Jim Doherty. I run this place. His name? Sure. His name is Jack Grimaldi. Hey, there he is now!"
In a flashback to some time earlier, we see Jack Grimaldi (Gary Oldman) (they are one and the same person) driving down a road somewhere in New York City and wearing a neat looking suit. Jim Doherty tells us that "Jack was a romantic guy, big dreams. The problem was, there was always a little daylight between his dreams and his wallet. See, he was a working stiff, 56 grand a year and never made it past Sergeant. And, every day he looked at a little of this, (We see Jack responding to a grisly murder scene; he is a police detective with the NYPD) and then he looked at too much of that (We see Jack on a stakeout watching a guy having sex with two girls.) And all the time he was thinking, huh, I bet you know what he was thinking, dontcha? you'd a done just what he wound up doin' I'll bet. He walked around just like everybody, but inside, he wasn't like anybody."
We see Jack come home to his wife and dancing with her in the back yard of their Brooklyn house until late in the night, as Doherty tells us she was his true love and he could've told her anything. We then flash forward to see Grimaldi trying to keep control of a car with blood all over his face, struggling with a woman who is trying to strangle him with her legs from the backseat. Donherty says "Hey wait a minute. I'm getting a little ahead of myself here." and stops the scene, asking the audience "Pretend you didn't see that. Now where was I?" We flash back to where we left off and we're told that Grimaldi's plan is working great, until the day "things started to go wrong."
In the next scene, Jack is watching federal agents who are guarding a mobster, Nick Gazzara (Dennis Farina) set to testify against the mob the next day. Nick jokes with the agents telling stories about old jobs while eating dinner. Jack watches from the rooftop across the street until he's sure of the room. He then calls the mob and gives them the information, for which he's paid $65,000 in a drop box.
We then see Jack blindfolded playing a guessing game with a teenage girl named Sheri (Juliette Lewis) Sheri tells him she dreamed he had a wife, and it was her. She tells him how happy she is to be with him. And Doherty tells us that "a man don't always do what's best for him, sometimes he does the worst." We see Jack on the couch making out with Sheri.
Later, at a restaurant, Jack tells his fellow cops about his secret mistress Sheri and they love the details. They talk about a recent case involving a mobster informant named Frank Malacci, who they're not getting any useful information from, when another cop comes in telling them that Nick Gazzara "got popped" and they suspect a top Russian assassin and ex-KGB agent Mona Demarkov. The cop with the news speculates that without Gazzara, they'll have to get information from DeMarkov. Jack visualizes the scene, when he hears that DeMarkov also killed the agents.
Jack Grimaldi meets with his mob connection and complains about the agents dying and how this makes him a cop killer, which wasn't part of the bribe deal. He tells Jack that Mona Demarkov has to be taken out (killed) and offers Jack the job. He concentrates on the money rather than worry anymore about cops possibly getting killed again. He arranges to pick up Mona (Lena Olin) from the police department, ostensibly to drive her to a safe house where the Feds are waiting for her. Jack checks them into a hotel and uncuffs her in the room. He lights her a cigarette and Mona asks him how he'd like to become a rich man. "Well, I've already got my health." he tells her, but listens anyway. She picks up her chair and moves it so she sits down touching his leg with hers. He quickly drops his gun for the sexual opportunity, which she encourages. She reaches for his gun before long, thinking him distracted, but finds he's moved it. The two of them are interrupted by Federal agents who have the room key and walk right in finding Mona and Jack on the floor. Mona starts laughing hysterically. He leaves her to the agents and then tips off the mob to her whereabouts, reminding Sal that the agents don't get hit.
Jack goes home to see his wife, Natalie (Annabella Sciorra) She fixes him food and complains that it's too fancy. She pulls a gun on him and says "I don't know Jack, You tell me." before laughing, revealing she's joking. He asks her about the photos she takes, and she tells him she hopes to photograph weddings. He sneaks outside and we see that he keeps all of his "extra" money in a hole in the yard beneath a metal cover. Doherty's voice over tells us that Jack hears "a sucking sound" from the hole and all he can think about is feeding the hole, blocking out thoughts of the casualties it took to make the money. He has a dream that night about Natalie and Mona both holding guns on him.
Jack visits with Sheri at her apartment, who dances in lingerie for him. He calls the station to check on homicides, hoping to hear that Mona was killed. Sheri asks "Is it hard yet baby?" and he replies "It ain't easy!"
Jack is now at the police station, in the middle of a poker game. Sal (Michael Wincott), another corrupt mob-connected officer, calls him at the station and tells him to come outside. They talk to each other from separate benches and Sal tells him that Mona wasn't there, and his boss, Don Falcone, wants to see Jack tomorrow and Sal advise him that he "better have something for him." He tells him that Falcone thinks he's holding out, and he'll need an address or something. Jack heads to the restroom where his fellow officer, Martie (Will Patton) finds him. Martie is in a panic and he tells Jack that he had picked up Mona Demarkov to transport her for the feds, who suspected someone was working both sides, and Mona took his gun and ran. Martie is afraid that he'll lose his job.
Jack pulls up Mona's file and finds a picture of her with mob boss Don Falcone (Roy Scheider) He steals a tape from the file, which tells him that Mona had an arrangement with an FBI agent, which left the agent mentally unstable culminating in his suicide. Jack goes home and checks on his money hole, not realizing that Natalie is watching him from the window.
The next day, Jack is escorted to Don Falcone's place where he meets the mob boss face-to-face for the first time. Jack acts outraged accusing Falcone of breaking their deal, reminding him that he said no cops would be killed. Falcone reminds him that he was paid, and says "a life's a life." Jack offers Falcone the money for Mona back, but Falcone won't take it telling him "I don't want the money back. I want Mona Demarkov dead." He tells Jack he's to find her and kill her. Jack refuses by saying that he won't kill her. Falcone responds by telling Jack a story about Robert Lowell meeting Louis Lepke. Lowell, a conscientious objector, being in prison for not killing anyone, and Lepke being in prison for the opposite. When the moral of the story doesn't catch with Jack, Don Falcone reminds him that he can do all sorts of things to him and his family and will if he doesn't deliver. He reminds Jack: "You see, you don't make the deals, Jack. I make the deals, and you're in until I say otherwise."
Jack gets back to his life and starts telling himself, "Stay alive, 65 grand, feed the hole." His fellow cops in their regular restaurant, notice he's flustered. He gets a phone call from Mona, who knows he's supposed to kill her by Wednesday. She tells him she's at the hotel, "our room." He meets her there and she asks what Falcone offered him and he tells her $65,000. Mona offers him $325,000 to tell Falcone that he killed her. She tells him they'll find a body and the autopsy will confirm it's her. She shows him a case holding half the amount and promises the other half when he has a death certificate.
Jack visits Sheri and she tells him she's leaving, because she doesn't fool around with married men. He tries to convince her to stay. He talks to Natalie next who wants to know why things have gotten worse for them instead of better. Natalie tells him that money is the only thing that lasts, but he acts like he doesn't know what she's talking about. She then asks if he's screwing her sister "or just my niece." She tells him "I don't know what you're doing Jack, but don't bring it back here."
A day or two later, the mobsters and cops all show up for Nick Gazzara's funeral, and Falcone takes the opportunity to talk to Jack in private. Falcone orders some of his thugs to rough Jack up and to chop one of his toes off for not killing Mona. Jack protests that it isn't Wednesday, but Falcone doesn't care.
With his left foot bandaged, Jack runs home afterwards and gives Natalie the bribe money from the yard, telling her what he'd been doing about being a mob informant, and to go to the Holiday Diner in Phoenix, Arizona and check for him there every six months, May 1st and December 1st. He asks her "Will you be there?" and she says "We're married, aren't we?" He says "That's no answer." and apologizes telling her that he loves her and can't live without her, begging her not to leave him. She tells him she did something at home, to let him know, and it's in the top drawer of the bureau. Jack says "I'll do anything." and Doherty narrates "Do what exactly? Can I tell you what makes love so frightening? It's that you don't own it, it owns you."
Jack then drops Sheri off at the subway station telling her also to leave the city, and she begs him to "Say it." He tells her "It's over." and Sheri adds "and you're sorry right, you're so fucking sorry."
Jack sits in his car starts writing an apology letter to Natalie, sobbing as he writes. Afterwards we see he's having trouble walking, due to his missing toe. He falls asleep at the waterfront and Mona shows up to meet him in a car. She shows him the last half of the money, and gives her a death certificate and fake ID, telling her she died of a shot to the chest. He asks Mona if she's ever been in love, she doesn't answer but instead wraps a cord around his neck and tries to strangle him. He struggles and gets out of the car and shoots Mona in her left leg. When she still struggles he knocks her out and puts her in the backseat of the car and drives off. We see that she wakes quickly, and reaches her calves up around his neck while he's driving, locking her feet together to choke him. He loses control of the car and hits a post, getting knocked out against the steering wheel. Mona squirms her way out of the car taking her papers in her teeth and running while still handcuffed.
Jack Grimaldi checks his house and finds the mobsters have gone through it. He finds a photo album in the top drawer of the bureau and takes it determined not to return there or anywhere familiar.
Jack starts watching Sal and finds that he's been meeting with Mona. He hears shots from the apartment where they're meeting and runs to check it out. Thinking he sees Mona moving at the window he shoots her several times, and approaches her to find that he just shot Sheri, who was dressed up in clothes and a wig to look like Mona from behind, as well as tied and gagged to the spot where she was standing. Jack runs off to find Mona, but she returns to the apartment when he leaves. She unties Sheri's corpse and pulls her own severed arm from her handbag, then cuts off Sheri's and replaces it with her own before lighting the place on fire.
The next morning Jack reads from a newspaper that Mona was found dead in the fire, just before some thugs find him. They catch him and knock him out while we see Mona outfitting herself with a prosthetic arm. We then see that Jack is cuffed to a bed in the same room and Mona points a gun at him, the scene matching the bad dream he'd had earlier.
Mona talks him out for a ride and reveals she has someone in the trunk. She opens it and he sees she has Falcone gagged and tied there. She tells him to dig a grave for Falcone. When he protests, Mona points a pistol at Jack and tells him "dig one grave or two." She pushes Falcone into the hole and has Jack fill it in at gunpoint. When he's buried she fires into the ground and tells Jack that he's a free man.
We see shortly afterwards, Mona and Jack at a dance, having a great time. Doherty narrates: "You ever wonder what Hell is like? Maybe it ain't the place you think. fire and brimstone? the Devil with horns poking you in the butt with a pitchfork? What's hell? The time you should have walked, but you didn't. That's hell. Huh, you're looking at it."
Mona and Jack are next in a hotel room. Jack counts some money in a suitcase and says "good bye." Mona asks him for "one last dance." before dropping her pants to the floor. "Why not." Jack Grimaldi says. In moments the door opens and the cops show up to arrest Jack Grimaldi. In the back of the squad car, he's given a letter from his fellow officers which reads " Jack, What a pisser. Here we are, fighting the bullshit for fifteen years and now we find out that you're part of the bullshit. What can we tell you? You broke our hearts, you dumbest of fucks. And, we mean that sincerely." Mona has betrayed Jack to the cops for being a mob informant and of the murders of Sheri, Falcone and others.
The police bring Jack to the same place at the Brooklyn courthouse he first brought Mona and try to convince him to cut a deal before Mona does, offering him witness relocation protection. He runs into Mona at the courthouse, and sees that they're letting her go for cooperating. She brags to him that even when they had sex, he never got to her. He tells her that during sex, he thought of his wife. Mona then tells him that's too bad because his wife is a dead woman and he's a dead man and laughs at him before walking away. Jack pulls a gun from Cage (James Cromwell) one of the officer's leg holsters and shoots Mona dead. He then puts the gun in his own mouth but finds it's empty. The empty chamber sounds along with the bell ringing at the Diner in Phoenix. He tells us he was given a medal for "defending his fellow officers" along with a new residence and identity.
The film comes full circle as we see him Jack now as Jim Doherty at the diner in Arizona, looking through the album of wedding photos on "May 1st, that was five years ago to the day. I guess this is where I came in, to tell you the story of an unlucky guy who fell in love with a hole in the ground; a ghost, haunting his own grave, celebrating every six months with the same party, waiting for the same guest of honor to show. Demarkov? Dead and buried. Everything I had, finito, except that old voice in my head. Some things you never let go of. Of course, Natalie, she wasn't the only guest invited [we see that the photo album has pages for other women] Can't be a party without a crowd. I don't remember much of it really. Don't remember what I said to 'em, or what they said to me back. Don't remember how I felt, but once in a while, I do remember how they looked at me." We see that there are no pictures of him and Mona, although Natalie had made pages for them. He continues "Well, I guess she's not gonna make it, always next time though, right?" He hears the door and jumps when he imagines Mona coming in. He then sees Natalie, but the image fades away. He walks out of the dinner and sits down at the gas pumps outside, narrating; "Maybe you think I'm ready to give up, but that ain't how it is. She could came walking through that door any day, cause even after all of this, I bet she still loves me."